You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:44:53