如何将TypeScript泛型类型参数约束为泛型类型?
如何将泛型类型参数约束为泛型类型?
这种需求完全可行,在TypeScript中可以通过泛型签名约束来实现对"泛型类型"的参数限制——把泛型类型看作是能接受类型参数的"类型级函数",通过定义泛型签名来约束它的结构。
基础约束实现
如果你想约束参数T是一个能接受单个类型参数的泛型类型(比如Array、Promise这类可以写成T<X>的类型),可以直接用泛型签名作为约束条件:
// 约束T是接受单个类型参数的泛型类型 type GenericModifier<T extends <U>() => any> = T<string>; // 测试:传入Array的构造函数(Array本身是泛型类) type StringArray = GenericModifier<typeof Array>; // 得到 Array<string>
实现你需要的Distribute类型
针对你给出的Distribute类型需求,可以调整为以下形式,确保target是一个可接受类型参数的泛型类型:
type Distribute< Target extends <A>() => A, Type > = Type extends infer A ? ReturnType<(typeof Target)<A>> : never; // 测试案例:将number | string分发到Array泛型中 type DistributedArray = Distribute<typeof Array, number | string>; // 最终得到 Array<number> | Array<string>
更精准的约束
如果需要更精准的约束(比如限制泛型类型的返回结构),可以明确泛型签名的返回值:
// 约束泛型类型必须返回带有value属性的对象 type GenericWithValue = <U>() => { value: U }; type GenericModifier2<T extends GenericWithValue> = T<number>; // 符合约束的类型示例 type ValidType = GenericModifier2<<U>() => { value: U }>; // { value: number }
内容的提问来源于stack exchange,提问作者BalaM314
相关产品推荐
相关产品推荐

