web-dev-qa-db-ja.com

Typescript配列vs any []

TypeScriptでは、Arrayany[]の違いは何ですか? Arrayは動的サイズの配列(もちろん、コンパイル時)を参照し、any[]は引数として渡され、コンパイラーによって型推論された静的サイズの配列を参照しますか?なぜなら私が現在次のような機能を持っているからです:

mergeArrays(arr1 : Array, arr2 : Array);

この関数を静的データで呼び出すと、TypeScriptは型付き配列(type[])を使用します。

mergeArrays([true, false],  [1, 2]);
//          bool[]          number[]

2つの間にコンパイル時の違いはありますか? any[]はいつ使用し、Arrayはいつ使用しますか? Array ..で変数を定義することもあります。

var info:Array;

..次のように設定すると、「cannot convert any [] [] to Array」のようなエラーが表示されます。

info = [[], []];
23
Robinicks

仕様セクション3.5.4は、それらの関係を指定しています。

ElementType[]形式の配列型は、インデックスシグネチャ[index: number]: ElementTypeに加えて、グローバルインターフェイス型Arrayに相当する一連のメンバーを持つオブジェクト型と同等です。ここで、マジック_element型のすべての出現は、ElementType

[[], []]または[]Arrayに割り当てることができないのはバグです。

TypeScriptには、「静的サイズの」配列という概念はありません。彼らは皆、同じ動的なサイズのJavaScript配列について話している:

var x = [1, 2];
x.Push(3);
x[13] = 5;
14
Ryan Cavanaugh

この質問に対する以前の回答は、しばらくの間古くなっています。

まず、Arrayにはジェネリックパラメータが必要です。

_var arr: Array<any>;
_

これは次と同等です。

_var arr: any[];
_

タイプ_Array<any>_と_any[]_は同一であり、どちらも可変/動的サイズの配列を参照します。

TypeScript 3.0はタプルを導入しました。これは固定/静的サイズの配列に似ていますが、実際にはそうではありません。

説明させてください。

構文は次のようになります。

_var arr: [any];
var arr: [any, any];
var arr: [any, any, any];
var arr: [string, number, string?, MyType];
_

TypeScriptは、その長さの配列と、一致する型を持つ値を割り当てることを強制します。
そして配列にインデックスを付けると、TypeScriptはそのインデックスにある変数のタイプを認識します。

TypeScriptでは、.Push()などの関数を使用したり、lengthに値を割り当てたりしても、タプルのサイズを変更できます。だから、あなたはあなたが偶然それをしないことを確認する必要があります。

追加の要素に「レスト」タイプを指定することもできます。

_var arr: [any, any, ...any[]];
var arr: [string, number, string?, MyType, ...YourType[]];
_

この場合、タプルにさらに項目を割り当てることができ、配列のサイズが変わる可能性があります。

注:通常の配列をタプルに割り当てることはできません。

レストタイプのみを指定した場合、通常の古い配列が取得されます。
次の2つの式は同等です。

_var arr: [...any[]];
var arr: any[];
_
3
zoran404