フィールド (field)
JavaScriptでインスタンスにフィールドを持たせるには、インスタンス化したオブジェクトのプロパティに値を代入します。
JavaScriptjs
classPerson {}constalice = newPerson ();alice .name = "Alice";
JavaScriptjs
classPerson {}constalice = newPerson ();alice .name = "Alice";
TypeScriptでは、これに加えてフィールドの型注釈を書く必要があります。
TypeScriptts
classPerson {name : string;}constalice = newPerson ();alice .name = "Alice";
TypeScriptts
classPerson {name : string;}constalice = newPerson ();alice .name = "Alice";
TypeScriptは、クラスの宣言に書かれていないフィールドへアクセスした場合、コンパイルエラーになります。
TypeScriptts
classPerson {}constperson = newPerson ();Property 'age' does not exist on type 'Person'.2339Property 'age' does not exist on type 'Person'.console .log (person .); age
TypeScriptts
classPerson {}constperson = newPerson ();Property 'age' does not exist on type 'Person'.2339Property 'age' does not exist on type 'Person'.console .log (person .); age
フィールドは宣言時に型を省略した場合でもコンストラクタで値が代入される場合は、代入する値で型が推論されます。下の例ではコンストラクタでstring
の型の値を代入しているためname
はstring
型となります。
ts
classPerson {privatename ;constructor(name : string) {this.name =name ;}}
ts
classPerson {privatename ;constructor(name : string) {this.name =name ;}}
初期化なしのフィールドとチェック
TypeScriptのコンパイラーオプションでstrictNullChecks
とstrictPropertyInitialization
の両方が有効になっている場合、次の例のname: string
の部分はコンパイルエラーとして指摘されます。なぜなら、new Person
した直後は、name
がundefined
になるためです。
ts
classPerson {Property 'name' has no initializer and is not definitely assigned in the constructor.2564Property 'name' has no initializer and is not definitely assigned in the constructor.: string; name }constalice = newPerson ();console .log (alice .name );
ts
classPerson {Property 'name' has no initializer and is not definitely assigned in the constructor.2564Property 'name' has no initializer and is not definitely assigned in the constructor.: string; name }constalice = newPerson ();console .log (alice .name );
📄️ strictNullChecks
null・undefinedのチェックを厳しくする
📄️ strictPropertyInitialization
クラスプロパティの初期化を必須にする
この2つのコンパイラーオプションが有効な場合でもチェックを通るように書くには、nameフィールドの型注釈をstring | undefined
のようなユニオン型にする必要があります。
ts
classPerson {name : string | undefined;}constalice = newPerson ();console .log (alice .name );
ts
classPerson {name : string | undefined;}constalice = newPerson ();console .log (alice .name );
コンストラクタを用いたフィールドの初期化
フィールドへの値代入は、コンストラクタを用いて行えます。コンストラクタの中では、this
を用いて値を代入したいフィールドにアクセスします。
TypeScriptts
classPerson {name : string;constructor() {this.name = "Alice";}}
TypeScriptts
classPerson {name : string;constructor() {this.name = "Alice";}}
コンストラクタに引数を持たせれば、フィールドの値を動的に指定できるようにもできます。
TypeScriptts
classPerson {name : string;constructor(personName : string) {this.name =personName ;}}constalice = newPerson ("Alice");
TypeScriptts
classPerson {name : string;constructor(personName : string) {this.name =personName ;}}constalice = newPerson ("Alice");