TypeScript如何让函数返回类型取决于入参可选属性是否存在
问题原因
你写的泛型条件类型本身逻辑是对的,报错是因为TypeScript无法在函数实现内部对未解析的泛型条件类型做自动收窄:即使你的运行时逻辑完全匹配类型定义,TS也无法推导返回值和泛型返回类型的对应关系,所以会抛出类型不匹配的提示。
推荐方案:函数重载
这种场景下用函数重载是最稳妥、可读性最高的实现,不需要额外类型断言,调用时类型提示也更清晰:
// 先定义用到的基础类型 type SomeType = { /* 你的SomeType原有定义 */ }; type SomeReturnType = { one: number; two: number; optionalResultProperty: string; }; // 重载1:入参不带optionalProperty时,返回剔除可选属性的类型 function foo(a: SomeType): Omit<SomeReturnType, "optionalResultProperty">; // 重载2:入参带optionalProperty时,返回完整类型 function foo(a: SomeType & { optionalProperty: string }): SomeReturnType; // 实现签名,用联合类型兼容两种入参即可 function foo(a: SomeType | (SomeType & { optionalProperty: string })) { if(a.optionalProperty === undefined) { return { one: 1, two: 2 } } else { return { one: 1, two: 2, optionalResultProperty: "some stuff" } } }
备选方案:泛型+类型断言
如果你更倾向用泛型写法,可以给返回值加显式类型断言绕开TS的实现校验:
type SomeType = { /* 你的SomeType原有定义 */ }; type SomeReturnType = { one: number; two: number; optionalResultProperty: string; }; function foo<T extends SomeType>(a: T): T extends SomeType & { optionalProperty: string } ? SomeReturnType : Omit<SomeReturnType, "optionalResultProperty"> { if(a.optionalProperty === undefined) { return { one: 1, two: 2 } as ReturnType<typeof foo<T>> } else { return { one: 1, two: 2, optionalResultProperty: "some stuff" } as ReturnType<typeof foo<T>> } }
内容的提问来源于stack exchange,提问作者puchm
相关产品推荐
相关产品推荐

