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
相关产品推荐
相关产品推荐

