将条件移至其他函数后TypeScript类型校验失败问题排查
解决TypeScript抽离类型判断函数后的类型收窄问题
问题出在你抽离的isPrimitive只是普通函数,TypeScript无法识别它的返回值能用来缩小变量的类型范围。要让TS支持通过这个函数做类型收窄,需要把它定义为类型谓词函数(Type Predicate),明确告诉TS函数返回true时参数的具体类型。
步骤1:修正isPrimitive为类型谓词函数
把函数的返回值类型改为element is string | number | boolean,同时参数类型用unknown代替any(更符合类型安全原则):
const isPrimitive = (element: unknown): element is string | number | boolean => { return ['string', 'number', 'boolean'].includes(typeof element); };
这个定义会让TS知道:当isPrimitive(element)返回true时,element一定是string/number/boolean中的一种;返回false时,element不属于这些类型。
步骤2:调整handler函数调用
直接用isPrimitive(source)做判断即可,TS会自动完成类型收窄:
type TSource = { someProperty: string; } | string; const handler = ({ source }: { source: TSource }): string => isPrimitive(source) ? source : source.someProperty; // 此处不再报错
此时TS能正确推断:当isPrimitive(source)返回false时,source只能是{ someProperty: string }类型,所以访问source.someProperty是完全安全的。
为什么之前的类型断言无效?
你用Omit<TSource, 'string'>是错误的用法,Omit工具类型仅针对对象类型生效,无法从联合类型中排除string这种原始类型。即使换成正确的Exclude<TSource, string>,直接断言属性的写法也不如类型守卫函数更直观、更符合TS的类型推导逻辑。
内容的提问来源于stack exchange,提问作者user8195210
相关产品推荐
相关产品推荐

