0Pricing
TypeScript Academy · 课时

用户自定义类型守卫函数

编写 is 谓词来创建自定义类型守卫

用户自定义类型守卫函数 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。

欢迎

用户定义的类型守卫可以使用 `is` 判定式返回类型,将类型收窄检查封装到可复用的函数中。

is 判定式返回类型

类型守卫函数返回 `paramName is Type`。当函数返回 true 时,TypeScript 会将参数收窄为该类型。
function isString(val: unknown): val is string {
  return typeof val === 'string';
}

使用类型守卫

在 if 条件中调用类型守卫。TypeScript 会在代码块中收窄类型。
function process(val: unknown) {
  if (isString(val)) {
    console.log(val.toUpperCase()); // val: string
  }
}

接口的类型守卫

由于不能对接口使用 instanceof,类型守卫是收窄接口联合类型的主要方式。
interface Cat { meow(): void }
interface Dog { bark(): void }
function isCat(pet: Cat | Dog): pet is Cat {
  return 'meow' in pet;
}

复杂对象的类型守卫

编写一个类型守卫,在运行时验证对象的结构,然后再将其用作特定类型。
interface User { name: string; age: number; }
function isUser(val: unknown): val is User {
  return (
    typeof val === 'object' &&
    val !== null &&
    typeof (val as any).name === 'string' &&
    typeof (val as any).age === 'number'
  );
}

类型守卫与类型断言

类型守卫会在运行时进行检查。类型断言(as Type)仅在编译时生效,并且可能提供错误信息。对于外部数据,请优先使用类型守卫。

将 Array.isArray 用作类型守卫

Array.isArray 是内置的类型守卫。TypeScript 能理解它,并据此收窄类型。
function flatten(val: string | string[]): string[] {
  return Array.isArray(val) ? val : [val];
}

泛型类型守卫

类型守卫可以使用泛型,从而创建可复用的运行时检查器。
function isNonNull<T>(val: T | null | undefined): val is T {
  return val !== null && val !== undefined;
}
const values = [1, null, 2, undefined].filter(isNonNull);
// values: number[]

断言函数

断言函数(使用 asserts)会在条件为 false 时抛出错误,并在调用之后收窄类型。
function assertIsString(val: unknown): asserts val is string {
  if (typeof val !== 'string') throw new TypeError('Not a string');
}
assertIsString(input);
console.log(input.toUpperCase()); // narrowed to string

类型守卫的职责

TypeScript 完全信任类型守卫的返回值。如果您的类型守卫有误,TypeScript 不会在编译时检测出不匹配。

filter 和 find 中的类型守卫

直接将类型守卫传递给 array.filter,以收窄结果类型。
const mixed: (string | null)[] = ['a', null, 'b'];
const strings = mixed.filter((x): x is string => x !== null);
// strings: string[]

快速检查

哪种返回类型注解可以将函数标记为 TypeScript 类型守卫?

回顾

用户定义的类型守卫使用 `param is Type` 返回类型封装类型收窄逻辑。它们适用于 filter/find,可以实现接口类型收窄,也可以使用泛型。断言函数无需返回布尔值即可收窄类型。

常见问题解答

「用户自定义类型守卫函数」课时是免费的吗?

是的 — 「用户自定义类型守卫函数」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。

「用户自定义类型守卫函数」这节课中我会学到什么?

编写 is 谓词来创建自定义类型守卫 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「用户自定义类型守卫函数」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 TypeScript Academy 课中编写并运行代码吗?

能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. typeof 与真值收窄
  2. instanceof 与 in 收窄
  3. 用户自定义类型守卫函数
  4. 使用 never 检查完整性
← 返回 TypeScript Academy