2016-09-27 1 views
2

:何らかの理由でTypeScriptでsplice関数の2番目のオーバーロードが見つかりませんか?私は活字体の遊び場に次のコードを書かれている

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

は、スプライス機能の第二の過負荷、すなわちsplice(start: number, deleteCount: number, ...items: T[]): T[];を発見し、コンパイラがエラーを報告していません。

しかし、最初のバージョンsplice(start: number): T[];が見つかりましたが、それはうまくコンパイルされます。

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

なぜそれは、2つのパラメータで呼び出すことが許可されていない間、一つのパラメータでスプライスを呼び出すためにOKですか?

答えて

1

(T | number)[] | (T | number)[][]のすべてが配列でなければならないとは限りませんが、理由はわかりません。あなたの関数の宣言を変更

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

(わかりやすくするためにインデント)

は、それを解決するようだとIMO、単純です。

一般的な表記法(input: Array<Array<T | number> | T | number>)を使用すると、3つの機能が同等であるにもかかわらず問題は解決されます(私はそう信じます)。

これは、Typescript Githubについて尋ねるものです。私はなぜそれがspliceの1つの過負荷を拾っているのか分かりませんが、他はありません。

+0

システムは、(T | number)[] | (T | number)[] []は配列でなければなりません。スプライス 'input.splice(1)'はコンパイルされているので、コンパイラは入力が配列であることを知っています。少なくともこれは私がそれを見ている方法です)) –

+0

@AlexanderNechay私はちょうどどのようなタイプのコンパイラのものが入力されるのか把握しようとしています。これは 'splice'メソッドを持つものですが、' Array'の通常のスプライスではありません。 – ssube

+0

TypeScriptチュートリアル:ユニオンタイプの値を持つ場合、ユニオン内のすべてのタイプに共通のメンバーにしかアクセスできません。ここで私が見る限り、違うことを言うコードがあります: 'let x1:number []; let x2:number [] []; x1.splice(1,1); x2.splice(1,1); let x:number [] |数[][]; x.splice(1,1); //エラー ' –

関連する問題