如何在TypeScript中使用否定类型?两种写法报错求解决方案
在TypeScript中实现否定类型的正确方式
你之前的两种写法都不符合TypeScript的语法规范,问题出在:
- 第一种写法里
is not不是合法的类型谓词语法,TypeScript只支持obj is 具体类型的形式,没有not关键字。 - 第二种写法把运行时的表达式当成了类型返回值,这完全不对,函数返回的类型必须是TypeScript的类型定义,不是代码表达式。
下面是两种可行的解决办法:
方法一:使用Exclude工具类型排除目标类型
Exclude<T, U>是TypeScript内置的工具类型,作用是从类型T中排除掉U类型。对于你的场景,就是排除undefined:
function notUndef(obj: any): obj is Exclude<typeof obj, undefined> { return obj !== void(0); }
方法二:使用NonNullable工具类型
如果你的需求是排除null和undefined,NonNullable<T>可以直接返回去掉这两个类型后的结果。如果只需要排除undefined,这个写法也适用(它同时排除null,但不影响你的判断逻辑):
function notUndef(obj: any): obj is NonNullable<typeof obj> { return obj !== void(0); }
额外提示
如果你的参数不是any,而是明确的联合类型(比如string | undefined),直接写具体的非否定类型会更清晰:
function notUndef(obj: string | undefined): obj is string { return obj !== void(0); }
内容的提问来源于stack exchange,提问作者Cflowe Visit
相关产品推荐
相关产品推荐

