TypeScript中泛型ParsedData无法正确推导,函数参数类型未达预期
问题原因分析
你的代码中,ParsedData 泛型被定义在最外层的 fromData 函数上,但调用 fromData({ user: 1 }) 时,TypeScript 只能推断出 RawData 的类型({ user: number }),此时还没有传入 parser 函数,无法确定 ParsedData 的具体类型,因此 TypeScript 会将其默认设为 unknown,导致后续 renderer 函数的 parsedData 参数类型为 unknown。
解决方案
将 ParsedData 泛型移到内层的 withParser 函数上,这样当调用 hasData(即 withParser)传入 parser 时,TypeScript 就能从 parser 的返回值推断出 ParsedData 的类型,并自动同步到 renderer 的参数上。
修正后的代码如下:
function fromData<RawData>(rawData: RawData) { return function withParser<ParsedData>( parser: (data: RawData) => ParsedData, renderer: (parsedData: ParsedData) => unknown ) { const parsedData = parser(rawData); return { renderedData: renderer(parsedData), parsedData }; }; } const hasData = fromData({ user: 1 }); hasData( (rawData) => rawData.user + 1, // 此处 parser 返回 number,ParsedData 被推断为 number (parsedData) => parsedData + 100 // parsedData 类型现在是 number,无类型错误 );
关键变化说明
- 外层
fromData仅保留RawData泛型,因为调用它时只有原始数据的类型信息可用。 - 内层
withParser新增ParsedData泛型,该泛型由传入的parser函数的返回值类型推断而来,确保renderer的参数类型与parser的返回类型完全匹配。
内容的提问来源于stack exchange,提问作者Dero
相关产品推荐
相关产品推荐

