TypeScript函数类型解析异常:返回值类型不匹配问题求助
解决TypeScript泛型函数返回值类型不匹配问题
你的代码里,FlatDataObject<T>是分布式条件类型,当泛型参数T是联合类型(比如string | undefined)时,它会把联合类型拆成单个类型分别计算再合并结果,这个类型定义本身是符合需求的。但函数内部返回时,TypeScript没法静态推断return undefined和return {data: value}分别对应联合类型的哪个分支,所以会抛出类型不匹配的错误。
下面提供两种可行的解决方法:
方法一:用函数重载明确类型映射
函数重载可以直接定义不同入参对应的返回值类型,让TypeScript准确识别:
type DataObject<T> = { data: T }; // 重载签名:处理入参为undefined的情况 function builder(value: undefined): undefined; // 重载签名:处理入参为非undefined的情况 function builder<T>(value: T): DataObject<T>; // 函数实现(内部逻辑) function builder<T>(value: T): undefined | DataObject<T> { if (value === undefined) { return undefined; } return { data: value, }; } const demo1 = builder<string>('asd'); // 类型为DataObject<string> const demo2 = builder<string | undefined>('asd'); // 类型为DataObject<string> const demo3 = builder(undefined); // 类型为undefined
方法二:调整条件类型为非分布式+类型断言
如果不想用重载,可将条件类型改为非分布式(把T包裹在元组里避免联合类型自动分发),再用类型断言告诉TypeScript返回值符合预期:
type DataObject<T> = { data: T }; // 非分布式条件类型:用[T]包裹避免联合类型拆分 type FlatDataObject<T> = [T] extends [undefined] ? undefined : DataObject<NonNullable<T>>; function builder<T>(value: T): FlatDataObject<T> { if (value === undefined) { return undefined as FlatDataObject<T>; } return { data: value as NonNullable<T>, } as FlatDataObject<T>; } const demo1 = builder<string>('asd'); // DataObject<string> const demo2 = builder<string | undefined>('asd'); // DataObject<string> | undefined const demo3 = builder(undefined); // undefined
补充说明
原来的FlatDataObject<T>在T为string | undefined时,会被拆分为string和undefined分别计算,最终得到DataObject<string> | undefined,这完全符合你的需求。但TypeScript在泛型函数内部无法通过if (value === undefined)这个判断来收窄泛型T的类型,所以没法自动确认返回值的类型匹配,需要通过重载或断言来辅助类型推断。
内容的提问来源于stack exchange,提问作者Manda
相关产品推荐
相关产品推荐

