TypeScript如何实现无返回值的type guard类型守卫能力
TypeScript 无返回值校验函数实现类型守卫的方法
你需要使用 TypeScript 3.7 版本后支持的 断言签名(Assertion Signature) 语法,该语法就是专门为抛出错误的校验场景设计的,只要函数正常返回没有抛出异常,TS 就会自动按你定义的规则收缩参数类型。
修正后的代码实现
// 泛型 + asserts 签名实现无返回值类型守卫 const isNotNull = <T>(obj: T): asserts obj is NonNullable<T> => { // 修正原代码的变量名错误、未定义isNull变量的问题 if (obj === null || obj === undefined) { throw new Error('object is null or undefined'); } } // 模拟获取对象的方法 const getObject = (): null | object => { return { info: '测试数据' }; } const obj: null | object = getObject(); isNotNull(obj); // 此处TS已经自动推断obj为object类型,不会再提示可能为null的错误 console.log(obj.toString());
语法说明
asserts obj is NonNullable<T>就是断言签名,作用是告诉TS编译器:如果这个函数执行完没有抛出错误,那么传入的obj参数一定符合NonNullable<T>的类型(即排除了null和undefined的类型)- 除了判空场景,你也可以自定义其他校验规则的断言函数,比如校验参数是否为字符串:
const assertIsString = (val: unknown): asserts val is string => { if (typeof val !== 'string') throw new Error('value is not string'); }
内容的提问来源于stack exchange,提问作者Kousha
相关产品推荐
相关产品推荐

