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

TypeScript中如何仅指定首个泛型参数,无需传入全部参数?

解决方案:无需柯里化的getWord函数实现

首先明确原始错误根源:未给后续泛型参数设置合理默认值,导致TypeScript要求必须传入所有3个类型参数。通过给泛型参数C和W设置基于第一个参数D的默认值,即可实现仅指定首个泛型参数的需求。

修正后的函数实现

type CommonDic<Dic> = {
  [I in keyof Dic]: {
    [W in keyof Dic[I]]: string;
  };
};

type MyDic = {
  a: {
    apple: string;
    ant: string;
  };
  b: {
    banana: string;
    bear: string;
  };
};

// 给C和W设置基于D的默认泛型参数
function getWord<
  D extends CommonDic<D>,
  C extends keyof D = keyof D,
  W extends keyof D[C] = keyof D[C]
>(
  category: C,
  word: W,
  dic: D
): D[C][W] {
  return dic[category][word];
}

// 测试用例
const myDic: MyDic = {
  a: { apple: '苹果', ant: '蚂蚁' },
  b: { banana: '香蕉', bear: '熊' }
};

// 仅指定首个泛型参数,正常运行
const apple = getWord<MyDic>('a', 'apple', myDic);
console.log(apple); // 输出:苹果

// 也可以不指定任何泛型参数,TypeScript会自动推导所有类型
const bear = getWord('b', 'bear', myDic);
console.log(bear); // 输出:熊

原理说明

  • 给C设置默认值keyof D,当仅指定D时,C默认约束为D的所有键(即'a' | 'b');
  • 给W设置默认值keyof D[C],W默认约束为当前C对应的子对象的所有键;
  • 函数参数的类型会进一步缩小泛型范围,TypeScript能自动匹配传入的category和word对应的具体类型,无需手动指定后续泛型参数。

另一种简洁实现(保持精确类型)

如果不想显式声明多个泛型参数,也可以通过类型推断直接约束参数类型,同时保持返回值的精确性:

function getWord<D extends CommonDic<D>, K extends keyof D>(
  category: K,
  word: keyof D[K],
  dic: D
): D[K][keyof D[K]] {
  return dic[category][word];
}

这种写法中,K会自动从category参数推导,word的类型基于K和D自动约束,同样支持仅通过传入dic参数或指定D泛型来使用。

内容的提问来源于stack exchange,提问作者Bright Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:00:53