如何让TypeScript实现类似typeof的自定义函数类型守卫?
让TypeScript通过自定义判断函数自动窄化类型
要实现你想要的类型推断效果,只需把isObject函数改成类型谓词函数——用value is object替代原本的boolean作为返回类型,TypeScript就能识别这个函数是类型守卫,在条件判断后自动窄化变量类型。
修改后的代码示例
File A
function isObject(value: unknown): value is object { return typeof value === 'object' && value !== null && !Array.isArray(value); }
File B
const myVariable: unknown = {}; // 实际场景为解析后的JSON,类型设为unknown if (isObject(myVariable)) { console.log(myVariable.foo); // 此处TypeScript会自动推断myVariable为object类型,不再报错 }
原理说明
类型谓词value is object会告诉TypeScript:当函数返回true时,传入的value参数必然是object类型(对应你函数里判断的非null、非数组对象)。因此在if分支中,myVariable的类型会从unknown被自动窄化为object,允许你直接访问它的属性。
如果需要更精准的类型约束(比如匹配特定结构的对象),还可以把object替换为自定义接口,示例如下:
interface TargetObject { foo: string; } function isTargetObject(value: unknown): value is TargetObject { return isObject(value) && typeof (value as TargetObject).foo === 'string'; }
调用isTargetObject(myVariable)的条件分支里,myVariable会被推断为TargetObject类型,能做更严格的类型校验。
内容的提问来源于stack exchange,提问作者Jesper Johansson
相关产品推荐
相关产品推荐

