You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript泛型实现动态数组:边界类型(2倍长度)创建疑问

解决方案

首先需要修正你现有的Point类型,原定义中泛型参数命名与Dimension类型冲突,且未限制长度参数为数字字面量,导致类型匹配逻辑存在问题:

// 修正后的Point类型:接收数字字面量N,生成长度为N的Number数组类型
type Point<N extends number, T extends Number[] = []> = T['length'] extends N ? T : Point<N, [...T, Number]>;

接下来实现Boundary类型,核心思路是从传入的Point<N>类型中提取长度N,然后生成长度为2N的数组类型。有两种简洁的实现方式:

方式一:基于Point类型合并

直接利用已有Point类型,将两个同长度的Point<N>合并为一个数组:

type Boundary<P extends Number[]> = P extends Point<infer N> ? [...Point<N>, ...Point<N>] : never;

方式二:通用两倍长度数组实现

不依赖Point类型,直接提取输入数组的长度并生成两倍长度的数组:

// 通用类型:生成长度为2*N的Number数组
type DoubleLength<N extends number, T extends Number[] = []> = T['length'] extends N ? [...T, ...T] : DoubleLength<N, [...T, Number]>;
// Boundary类型:提取输入Point的长度,生成两倍长度数组
type Boundary<P extends Number[]> = DoubleLength<P['length']>;

使用验证

两种方式都能满足你的需求:

// 使用示例1
const x = [1,2,3] as Point<3>;
const xBoundary = [1,2,3,4,5,6] as Boundary<Point<3>>; // 类型匹配正确

// 使用示例2
const y = [1,2,3,4] as Point<4>;
const yBoundary = [1,2,3,4,5,6,7,8] as Boundary<Point<4>>; // 类型匹配正确

你之前的问题分析

你尝试的写法错误地将Point作为类型构造器直接用于数组扩展,TypeScript无法识别未实例化的泛型构造器作为数组元素类型。正确的做法是先从传入的Point<N>实例中提取长度参数,再基于该长度生成目标数组类型。

内容的提问来源于stack exchange,提问作者Justin Seo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:39:59