TypeScriptで「犯罪の3つ」と呼ばれる単純なロジックゲームを作成しています。
TypeScriptで事前に割り当てられた型付き配列をしようとすると、次のようなことをしようとしました。
var arr = Criminal[];
「式用語の形式を確認してください」というエラーが発生しました。
これもやってみた
var arr : Criminal = [];
これにより、「any []を「Criminal」に変換できません
これを行う「TypeScript」の方法は何ですか?
TypeScriptで型付き配列を正しく事前に割り当てるという問題は、配列リテラル構文のために多少不明瞭になったため、最初に思ったほど直感的ではありませんでした。
正しい方法は
var arr : Criminal[] = [];
これにより、変数 'arr'に格納された正しく型付けされた空の配列が得られます。
これが他の人に役立つことを願っています!
既存の回答には選択肢がありませんでしたので、以下に完全なリストを示します。
// 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>();
型を明示的に指定することは、変数宣言の型推論が失敗した場合の一般的な解決策です。
type assertion (キャストと呼ばれることもありますが、TypeScriptでは実際にはキャストではない)を使用する利点は、どの式でも機能するため、変数が宣言されていない場合でも使用できます。型アサーションには2つの構文がありますが、気にする場合は後者だけがJSXと組み合わせて機能します。
Arrayコンストラクタを使用することは、この特定のユースケースでのみ役立ちますが、個人的には最も読みやすいと思います。ただし、実行時にわずかな パフォーマンスへの影響 があります。また、誰かが配列コンストラクターを再定義するのに夢中だった場合、 意味が変わる可能性があります 。
個人的な好みの問題ですが、3番目のオプションが最も読みやすいと思います。ほとんどの場合、前述の欠点は無視でき、読みやすさが最も重要な要素です。
*: 楽しい事実;執筆時点では、Chromeのパフォーマンスの差は60%でしたが、Firefoxでは測定可能なパフォーマンスの差はありませんでした。
私はこれが古い質問であることを知っていますが、最近、特定のタイプの空の配列を返さなければならなかったため、この方法では解決できない同様の問題に直面しました。
持っていた
return [];
ここで、[]
はCriminal[]
タイプでした。
return: Criminal[] [];
もreturn []: Criminal[];
も私にとってはうまくいきませんでした。
一見、それを返す直前に型付き変数を作成することで解決しました( yo 正しく報告されます)が、(JavaScriptエンジンの動作がわかりません)オーバーヘッドが発生し、読みにくくなります。
徹底的に説明するために、この解決策を回答でも報告します。
let temp: Criminal[] = [];
return temp;
最終的にTypeScript型キャストが見つかりました。これにより、問題をより簡潔で読みやすい(そしておそらくは効率的な)方法で解決できました。
return <Criminal[]>[];
これが将来の読者に役立つことを願っています!
以下のように公開アクセスする場合:
public arr: Criminal[] = [];