TypeScript无法推导泛型返回类型问题求助
TypeScript泛型函数返回类型匹配问题解决
问题原因
这是TypeScript泛型系统的局限性导致的:你的泛型函数getMyTypeConfig<T extends MyType>中,虽然switch分支能成功收窄myTypeObject的具体类型,但TypeScript无法将分支内的具体类型(如MyTypeA)与泛型参数T建立关联。泛型参数T始终是一个宽泛的约束(MyTypeA | MyTypeB),因此返回MyTypeConfig<MyTypeA>时,TS会认为它与MyTypeConfig<T>不兼容——因为T理论上可能是MyTypeB。
解决方案:使用函数重载
函数重载能明确指定每个输入类型对应的返回类型,完美适配你的需求,同时保证类型安全:
export enum MyEnum { A = "A", B = "B", } export type MyTypeA = { type: MyEnum.A; data: { a: string; }; }; export type MyTypeB = { type: MyEnum.B; data: { b: string; }; }; export type MyType = MyTypeA | MyTypeB; export type MyTypeConfig<T extends MyType> = { getManipulatedData: (mt: T) => string; }; // 重载签名:明确输入与输出的一对一映射 export function getMyTypeConfig(myTypeObject: MyTypeA): MyTypeConfig<MyTypeA>; export function getMyTypeConfig(myTypeObject: MyTypeB): MyTypeConfig<MyTypeB>; // 函数实现:处理具体逻辑 export function getMyTypeConfig(myTypeObject: MyType): MyTypeConfig<MyType> { switch (myTypeObject.type) { case MyEnum.A: console.log(myTypeObject.data.a); return { getManipulatedData: (mt) => mt.data.a + "A", } as MyTypeConfig<MyType>; case MyEnum.B: return { getManipulatedData: (mt) => mt.data.b + "B", } as MyTypeConfig<MyType>; default: throw new Error(`Unsupported type: ${myTypeObject.type}`); } }
说明
- 重载签名直接告诉TS:传入
MyTypeA就返回MyTypeConfig<MyTypeA>,传入MyTypeB就返回MyTypeConfig<MyTypeB>,完全符合你的需求。 - 实现中的类型断言
as MyTypeConfig<MyType>是安全的,因为重载已经约束了输入输出的对应关系,TS只是在实现层面无法自动推断,需要我们手动确认。 - 添加
default分支抛出错误,避免函数出现无返回值的情况,符合TS的严格模式要求。
备选方案:泛型断言(不推荐)
如果不想用重载,也可以在分支里直接断言返回值为MyTypeConfig<T>,但这种方式不如重载安全——后续新增类型时容易遗漏对应分支,且无法得到TS的编译提醒:
export const getMyTypeConfig = <T extends MyType>(myTypeObject: T): MyTypeConfig<T> => { switch (myTypeObject.type) { case MyEnum.A: console.log(myTypeObject.data.a); return { getManipulatedData: (mt: MyTypeA) => mt.data.a + "A", } as MyTypeConfig<T>; case MyEnum.B: return { getManipulatedData: (mt: MyTypeB) => mt.data.b + "B", } as MyTypeConfig<T>; default: throw new Error(`Unsupported type: ${myTypeObject.type}`); } };
内容的提问来源于stack exchange,提问作者Kostis
相关产品推荐
相关产品推荐

