TypeScript:从剩余参数的泛型联合类型中获取单个类型
解决TypeScript剩余参数保留单个元素类型推断的问题
要让剩余参数的每个元素保留各自的SomeClass<具体Union成员>类型,需要用元组泛型+映射类型来约束函数参数,而非简单的数组泛型。
修改后的函数定义
type SomeUnion = "first" | "second" | "third" class SomeClass<TypeFromUnion extends SomeUnion>{} // 核心修改:用元组泛型T,映射出每个位置的具体类型 function someFn<T extends SomeUnion[]>(...rest: { [K in keyof T]: SomeClass<T[K]> }) {}
调用效果验证
调用时每个参数的类型都会被精准推断:
// rest[0] 类型为 SomeClass<"first"> someFn(new SomeClass<"first">()) // rest[0] → SomeClass<"third">,rest[1] → SomeClass<"second"> someFn(new SomeClass<"third">(), new SomeClass<"second">()) // rest[0] → SomeClass<"third">,rest[1] → SomeClass<"first">,rest[2] → SomeClass<"second"> someFn(new SomeClass<"third">(), new SomeClass<"first">(), new SomeClass<"second">())
原理说明
- 泛型
T会被推断为传入参数对应的元组(比如第二个调用中T是["third", "second"]) - 映射类型
{ [K in keyof T]: SomeClass<T[K]> }遍历元组的每个位置,将每个元素类型对应为SomeClass<元组对应位置的Union成员>,从而保留单个参数的原始类型,避免被合并为联合类型。
内容的提问来源于stack exchange,提问作者Levap
相关产品推荐
相关产品推荐

