TypeScript如何无需构造器传参初始化指定长度N的泛型Tuple属性
解决方案
首先明确核心前提:TypeScript 泛型属于编译期类型,运行时会被完全擦除,因此确实无法直接从泛型参数N extends number直接获取到运行时可用的长度值。我们可以通过「绑定泛型参数和构造函数入参类型」的方式,在仅传入长度数值的前提下完成类型安全的初始化,不需要用户传入完整的元组。
前置TupleOf类型定义
如果还没定义TupleOf可以用以下实现:
type TupleOf<T, N extends number, R extends unknown[] = []> = R['length'] extends N ? R : TupleOf<T, N, [T, ...R]>;
类实现代码
class Dimension<N extends number> { private data: TupleOf<number, N>; /** * @param length 元组长度,和泛型参数N严格绑定 * @param fillValue 可选,元组初始填充值,默认填0 */ constructor(length: N, fillValue: number = 0) { // 运行时生成长度匹配的数组,此处类型断言安全,运行时长度和泛型N完全对应 this.data = Array.from({ length }, () => fillValue) as TupleOf<number, N>; } }
使用示例
// 实例化3维实例,自动生成[number, number, number]类型的data const dim3 = new Dimension(3); // 实例化5维实例,所有值默认填充10 const dim5 = new Dimension(5, 10);
可选优化:支持默认维度
如果大部分场景使用固定维度,可以给泛型和构造参数加默认值:
class Dimension<N extends number = 2> { private data: TupleOf<number, N>; constructor(length: N = 2 as N, fillValue: number = 0) { this.data = Array.from({ length }, () => fillValue) as TupleOf<number, N>; } } // 不传参数默认生成2维实例 const defaultDim = new Dimension();
内容的提问来源于stack exchange,提问作者Harald
相关产品推荐
相关产品推荐

