TypeScript 4.9:解决'in'运算符NonNullable<K>类型报错(2638)的方法
解决TypeScript 4.9中
in运算符的TS2638错误 在TypeScript 4.9的严格类型检查逻辑下,当泛型参数约束为K extends KeyOrId | null时,即便通过!keyOrId排除了null值,TypeScript仍无法确定NonNullable<K>必然是对象类型,导致执行'id' in keyOrId时触发TS2638错误。以下是几种可行的解决方式:
方式一:使用类型断言明确类型
直接将非空后的keyOrId断言为KeyOrId,让TypeScript确认其为对象类型:
export type KeyOrId = | { key: string; } | { id: string; }; export default function foo<K extends KeyOrId | null>( keyOrId: K, ) { if (!keyOrId) { return undefined; } return 'id' in (keyOrId as KeyOrId); }
方式二:添加自定义对象类型守卫
通过自定义类型守卫函数,精准判断keyOrId是对象且非空,帮助TypeScript缩小类型范围:
export type KeyOrId = | { key: string; } | { id: string; }; function isNonEmptyObject(value: unknown): value is object { return typeof value === 'object' && value !== null; } export default function foo<K extends KeyOrId | null>( keyOrId: K, ) { if (!isNonEmptyObject(keyOrId)) { return undefined; } return 'id' in keyOrId; }
方式三:调整泛型约束(若无需保留泛型灵活性)
如果不需要泛型带来的类型推导灵活性,直接将参数类型设为KeyOrId | null,TypeScript可直接识别非空值为对象:
export type KeyOrId = | { key: string; } | { id: string; }; export default function foo( keyOrId: KeyOrId | null, ) { if (!keyOrId) { return undefined; } return 'id' in keyOrId; }
内容的提问来源于stack exchange,提问作者wegry
相关产品推荐
相关产品推荐

