如何用TypeScript泛型基于一个参数限制另一个函数参数?
利用TypeScript泛型根据数组参数限制另一个参数的取值范围
完全可以实现这种限制,核心思路是通过字面量类型结合泛型,让TypeScript自动捕获数组参数的具体元素类型,再用这个类型约束另一个参数的取值。
修正后的代码示例
interface MyTestInterface { var1: string; var2: boolean; var3: number; } interface MyTestLink<T> { from: T; to: T; } // 泛型T限定为MyTestInterface键的子集,自动捕获vars数组的具体元素类型 function isThisPossible<T extends keyof MyTestInterface>( vars: T[], links: MyTestLink<T>[] // 用T替代any,强制from/to只能是vars中的元素 ) { // 编写你的业务逻辑 } function testFunction() { // 合法调用:from和to都在vars数组中 isThisPossible( ["var1", "var2"], [{ from: "var1", to: "var2" }] ); // 编译错误:"var3"不在vars数组内,不符合类型约束 isThisPossible( ["var1", "var2"], [{ from: "var1", to: "var3" }] ); }
原理说明
- 泛型自动推断:当你传入
["var1", "var2"]作为vars参数时,TypeScript会自动将泛型T推断为字面量联合类型"var1" | "var2",而非宽泛的keyof MyTestInterface。 - 类型约束传递:
links参数被定义为MyTestLink<T>[],这意味着每个link对象的from和to属性必须属于T类型,也就是只能是vars数组中包含的元素。 - 编译时检查:如果
links中出现vars以外的值,TypeScript编译器会直接抛出错误,完全满足你的需求。
原代码的问题
原代码中KI extends keyof I仅限制了vars是MyTestInterface的键,但没有将具体的键集合与links关联起来,使用any会丢失类型检查能力。通过让泛型T捕获数组的具体字面量类型,就能实现严格的取值范围限制。
内容的提问来源于stack exchange,提问作者Martin Nielsen
相关产品推荐
相关产品推荐

