用户自定义类型守卫函数
编写 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 反馈 — 无需本地设置。
此课程中的所有课时
- typeof 与真值收窄
- instanceof 与 in 收窄
- 用户自定义类型守卫函数
- 使用 never 检查完整性