我已将以下代码写入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是不行的,而不允许用两个参数调用?
答案 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。