在TypeScript中为什么找不到第二个splice函数重载?

时间:2016-09-27 20:40:39

标签: typescript

我已将以下代码写入TypeScript playground:

let x: number[] | number[][];
let y = x.splice(1, 1); // ERROR: Supplied parameters do not match any signature of call target.

由于某种原因,未找到splice函数的第二次重载,即splice(start: number, deleteCount: number, ...items: T[]): T[];,编译器报告错误。

但是找到第一个版本splice(start: number): T[];并且它编译得很好。

let x: number[] | number[][];
let y = x.splice(1); // OK

为什么用一个参数调用splice是不行的,而不允许用两个参数调用?

2 个答案:

答案 0 :(得分:1)

系统无法判断所有(T | number)[] | (T | number)[][]必须是数组,但我不确定原因。

将您的函数声明更改为:

function f<T>(
  input: (T | T[] | number | number[])[]
)

(为了清晰起见,缩进)

似乎解决了它,并且更简单,IMO。

使用通用符号(input: Array<Array<T | number> | T | number>)也解决了问题,尽管这三个都是等价的(我相信)。

这可能是关于Typescript Github的问题。我不确定为什么它会引起splice的一次重载而不是其他重载。

答案 1 :(得分:0)

这被证明是splice函数的lib.d.ts定义中的错误:https://github.com/Microsoft/TypeScript/issues/11205