如何让TypeScript准确识别闭包实现的pair系列函数返回类型?
优化闭包版Pair函数的类型推断问题
你的闭包版本中,Pair<T1, T2>类型被定义为接受1 | 2参数并返回T1 | T2,TypeScript无法区分传入1或2时的具体返回类型,导致head和tail的返回值被推断为联合类型。可以通过以下两种方式优化,让TypeScript准确识别返回类型:
方案1:使用条件类型的泛型函数类型
修改Pair的类型定义,让返回类型与输入参数的具体值关联:
// 定义Pair为泛型函数,返回类型依赖于输入的n值 type Pair<T1, T2> = <N extends 1 | 2>(n: N) => N extends 1 ? T1 : T2 function pair<T1, T2>(a: T1, b: T2): Pair<T1, T2> { return (n) => { return n === 1 ? a : b; }; } function head<T1, T2>(p: Pair<T1, T2>): T1 { return p(1); } function tail<T1, T2>(p: Pair<T1, T2>): T2 { return p(2); } const p = pair(1, "hello"); const h = head(p); // TypeScript推断为number类型 const t = tail(p); // TypeScript推断为string类型
原理:通过条件类型N extends 1 ? T1 : T2,让TypeScript根据传入的n的具体值(1或2),动态推断对应的返回类型。当调用p(1)时,N被推断为1,返回类型自动锁定为T1;调用p(2)时同理返回T2。
方案2:使用函数重载定义Pair类型
通过函数重载明确不同输入参数对应的返回类型:
// 用重载签名定义Pair的行为:传入1返回T1,传入2返回T2 type Pair<T1, T2> = { (n: 1): T1; (n: 2): T2; }; function pair<T1, T2>(a: T1, b: T2): Pair<T1, T2> { return (n: 1 | 2) => { switch (n) { case 1: return a; case 2: return b; } }; } function head<T1, T2>(p: Pair<T1, T2>) { return p(1); } function tail<T1, T2>(p: Pair<T1, T2>) { return p(2); } const p = pair(1, "hello"); const h = head(p); // TypeScript推断为number类型 const t = tail(p); // TypeScript推断为string类型
原理:函数重载为Pair定义了两个明确的调用签名,TypeScript会根据传入的参数值匹配对应的签名,从而准确推断返回类型。
两种方案都能解决类型推断问题,你可以根据代码风格偏好选择其中一种。
内容的提问来源于stack exchange,提问作者WestMountain
相关产品推荐
相关产品推荐

