TypeScript中如何定义和使用自定义类型守卫函数
时间:2026-08-13 | 作者:夜鞌不睡 | 阅读:0TypeScript 中自定义类型守卫函数通过 val is Type 类型谓词实现在运行时判断类型,并让编译器缩小类型范围;需满足单参数且返回类型为类型谓词,仅在直接调用时生效。
在 TypeScript 里,自定义类型守卫函数用于在运行时确认一个值是否属于某种特定类型。
同时,它还能让编译器自动收窄类型范围。
关键在于,函数返回类型不是普通布尔值,而是形如 val is Type 的类型谓词(type predicate)。
定义类型守卫函数
类型守卫函数成立,需要满足两个前提:
- 函数必须接收一个参数
- 返回类型必须写成
arg is SomeType
这个返回类型的含义是:一旦函数返回 true,后续作用域里这个参数就可以被安全地当作 SomeType 来处理。
例如,判断一个值是否为非空字符串:
function isNonEmptyString(val: unknown): val is string {
return typeof val === 'string' && val.length > 0;
}
需要注意,val is string 不是布尔类型,而是类型谓词。
它不改变运行时行为,只影响类型检查。
在条件分支中使用类型守卫
调用类型守卫后,TypeScript 会在 if 块内自动收窄类型。
因此,无需额外断言或类型转换。
- 守卫返回
true时,参数类型会被精确推导为谓词右侧的类型 - 守卫返回
false时,类型不会被收窄,但可通过else处理其他情况
示例:
function processInput(input: unknown) {
if (isNonEmptyString(input)) {
// 此处 input 的类型已被推导为 string(且非空)
console.log(input.toUpperCase()); // 安全调用
} else {
// input 类型仍是 unknown
console.log('Not a non-empty string');
}
}
处理联合类型与对象类型守卫
类型守卫对联合类型特别有用。
例如,可以用它区分接口的不同实现:
interface Admin { role: 'admin'; permissions: string[]; }
interface User { role: 'user'; lastLogin: Date; }
type Person = Admin | User;
function isAdmin(person: Person): person is Admin {
return person.role === 'admin';
}
function handlePerson(person: Person) {
if (isAdmin(person)) {
console.log(person.permissions); // 可访问 Admin 特有属性
} else {
console.log(person.lastLogin); // 此时 person 是 User
}
}
这里的关键是,守卫函数内部逻辑必须足够可靠。
例如,应优先检查不可变字段或类型标识符,避免误判导致类型错误。
注意事项与常见陷阱
类型守卫仅在直接调用位置生效。
不能通过变量间接调用来完成类型收窄。
- 正确:
if (isNonEmptyString(x)) { ... } - 错误:
const guard = isNonEmptyString; if (guard(x)) { ... }(TypeScript 无法识别该变量是类型守卫)
另外,类型守卫不能用于泛型参数的运行时检查。
原因在于泛型擦除。
这类场景需要配合具体类型,或使用 typeof、instanceof 等原生机制。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- JavaScript正则表达式批量处理HTML标签转义与替换方法
- 时间:2026-08-21
-
- JavaScript函数默认参数的精准JSDoc类型注解方法
- 时间:2026-08-21
-
- JavaScript设置Cookie的SameSite属性防范CSRF攻击
- 时间:2026-08-21
-
- JavaScript中BOM如何打开新的浏览器窗口标签
- 时间:2026-08-20
-
- JavaScript微任务队列在事件循环中的执行机制
- 时间:2026-08-20
-
- JavaScript中网络超时如何用流程控制实现中断
- 时间:2026-08-20
-
- JavaScript防抖函数原理与减少高频事件触发方法
- 时间:2026-08-20
-
- TypeScript六个颠覆认知的核心知识点解析
- 时间:2026-08-20
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15
