如何基于联合类型参数推断返回类型?映射类型函数报错解决
解决TypeScript映射类型函数的类型推断错误
错误原因
你的函数使用泛型T extends keyof MappedType,但TypeScript无法在if (key === 'a')的分支中自动将泛型T缩小为具体的'a'——因为T可能是'a' | 'b'的联合类型。此时TypeScript会认为返回值必须满足所有MappedType[T]的交集(即{a: string} & {b: number}),而你的返回值只符合MappedType['a'],因此触发类型错误。
解决方案
方案1:使用函数重载(推荐)
通过重载签名明确不同参数对应的返回类型,让TypeScript精准推断:
type MappedType = { a: { a: string; }; b: { b: number; } }; // 重载签名:定义不同入参对应的返回类型 function getValue(key: 'a'): MappedType['a']; function getValue(key: 'b'): MappedType['b'] | undefined; // 实现签名:包含所有可能的情况 function getValue(key: keyof MappedType): MappedType[keyof MappedType] | undefined { if (key === 'a') { return { a: '2' }; } return; }
方案2:使用类型断言
如果不想用重载,可以在返回时用类型断言告诉TypeScript当前分支的返回值符合MappedType[T]:
type MappedType = { a: { a: string; }; b: { b: number; } }; function getValue<T extends keyof MappedType>(key: T): MappedType[T] | undefined { if (key === 'a') { // 断言当前返回值匹配MappedType[T] return { a: '2' } as MappedType[T]; } return; }
说明
函数重载的方式更优,它能让函数的类型定义更清晰,调用时IDE会给出更精准的类型提示;类型断言则更简洁,但需要你确保断言的类型正确性,避免潜在的类型不匹配问题。
内容的提问来源于stack exchange,提问作者熊俊文
相关产品推荐
相关产品推荐

