web-dev-qa-db-ja.com

TypeScript:空の型付きコンテナー配列の作成

TypeScriptで「犯罪の3つ」と呼ばれる単純なロジックゲームを作成しています。

TypeScriptで事前に割り当てられた型付き配列をしようとすると、次のようなことをしようとしました。

var arr = Criminal[];

「式用語の形式を確認してください」というエラーが発生しました。

これもやってみた

var arr : Criminal = [];

これにより、「any []を「Criminal」に変換できません

これを行う「TypeScript」の方法は何ですか?

128
darethas

TypeScriptで型付き配列を正しく事前に割り当てるという問題は、配列リテラル構文のために多少不明瞭になったため、最初に思ったほど直感的ではありませんでした。

正しい方法は

var arr : Criminal[] = [];

これにより、変数 'arr'に格納された正しく型付けされた空の配列が得られます。

これが他の人に役立つことを願っています!

198
darethas

既存の回答には選択肢がありませんでしたので、以下に完全なリストを示します。

// 1. Explicitly declare the type
var arr: Criminal[] = [];

// 2. Via type assertion
var arr = <Criminal[]>[];
var arr = [] as Criminal[];

// 3. Using the Array constructor
var arr = new Array<Criminal>();
  1. 型を明示的に指定することは、変数宣言の型推論が失敗した場合の一般的な解決策です。

  2. type assertion (キャストと呼ばれることもありますが、TypeScriptでは実際にはキャストではない)を使用する利点は、どの式でも機能するため、変数が宣言されていない場合でも使用できます。型アサーションには2つの構文がありますが、気にする場合は後者だけがJSXと組み合わせて機能します。

  3. Arrayコンストラクタを使用することは、この特定のユースケースでのみ役立ちますが、個人的には最も読みやすいと思います。ただし、実行時にわずかな パフォーマンスへの影響 があります。また、誰かが配列コンストラクターを再定義するのに夢中だった場合、 意味が変わる可能性があります

個人的な好みの問題ですが、3番目のオプションが最も読みやすいと思います。ほとんどの場合、前述の欠点は無視でき、読みやすさが最も重要な要素です。

*: 楽しい事実;執筆時点では、Chromeのパフォーマンスの差は60%でしたが、Firefoxでは測定可能なパフォーマンスの差はありませんでした。

86
Thorarin

私はこれが古い質問であることを知っていますが、最近、特定のタイプの空の配列を返さなければならなかったため、この方法では解決できない同様の問題に直面しました。

持っていた

return [];

ここで、[]Criminal[]タイプでした。

return: Criminal[] [];return []: Criminal[];も私にとってはうまくいきませんでした。

一見、それを返す直前に型付き変数を作成することで解決しました( yo 正しく報告されます)が、(JavaScriptエンジンの動作がわかりません)オーバーヘッドが発生し、読みにくくなります。

徹底的に説明するために、この解決策を回答でも報告します。

let temp: Criminal[] = [];
return temp;

最終的にTypeScript型キャストが見つかりました。これにより、問題をより簡潔で読みやすい(そしておそらくは効率的な)方法で解決できました。

return <Criminal[]>[];

これが将来の読者に役立つことを願っています!

15
Fylax

以下のように公開アクセスする場合:

public arr: Criminal[] = [];
0
rk13