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

如何对数组类型联合类型执行操作?解决TypeScript类型兼容问题

解决联合类型数组splice操作的类型错误问题

你的代码里TypeScript报错的核心原因是:当参数x是number[] | string[]联合类型时,TS无法自动关联x.splice(0,1)返回的v和x的具体类型——虽然我们清楚x是数字数组时v肯定是数字数组,x是字符串数组时v是字符串数组,但TS的联合类型推导做不到这种关联,所以会认为v可能和x的元素类型不匹配。

下面是几种可行的解决方式:

方式一:使用泛型约束

通过泛型把数组元素类型和函数绑定,让TS能精确推导类型:

type Foo = number[]
type Bar = string[]

function move<T extends number | string>(x: T[]) {
    const v = x.splice(0, 1)
    x.splice(1, 0, ...v)
}

方式二:类型断言明确类型

直接断言v的类型和x的元素类型一致:

type Foo = number[]
type Bar = string[]

function move(x: Foo | Bar) {
    const v = x.splice(0, 1) as (typeof x)[0][]
    x.splice(1, 0, ...v)
}

这里(typeof x)[0]会取x数组的元素类型,断言v是该类型的数组,消除类型不匹配的报错。

方式三:函数重载

针对两种数组类型分别定义重载签名,让TS根据传入参数匹配对应类型:

type Foo = number[]
type Bar = string[]

function move(x: Foo): void;
function move(x: Bar): void;
function move(x: Foo | Bar) {
    const v = x.splice(0, 1)
    x.splice(1, 0, ...v)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:57:12