constアサーション「as const」 (const assertion)
オブジェクトリテラルの末尾にas const
を記述すればプロパティがreadonly
でリテラルタイプで指定した物と同等の扱いになります。
ts
constpikachu = {name : "pikachu",no : 25,genre : "mouse pokémon",height : 0.4,weight : 6.0,} asconst ;
ts
constpikachu = {name : "pikachu",no : 25,genre : "mouse pokémon",height : 0.4,weight : 6.0,} asconst ;
代入はもちろんできません。
ts
Cannot assign to 'name' because it is a read-only property.2540Cannot assign to 'name' because it is a read-only property.pikachu .= "raichu"; name
ts
Cannot assign to 'name' because it is a read-only property.2540Cannot assign to 'name' because it is a read-only property.pikachu .= "raichu"; name
readonly
とconst assertion
の違い
どちらもオブジェクトのプロパティをreadonly
にする機能は同じですが、以下が異なります。
readonly
はプロパティごとにつけられる
const assertion
はオブジェクト全体に対する宣言なので、すべてのプロパティが対象になりますが、readonly
は必要なプロパティのみにつけることができます。
const assertion
は再帰的にreadonly
にできる
オブジェクトの中にオブジェクトがあるときの挙動が異なります。たとえば次のようなオブジェクトがあるとします。
ts
typeCountry = {name : string;capitalCity : string;};typeContinent = {readonlyname : string;readonlycanada :Country ;readonlyus :Country ;readonlymexico :Country ;};constamerica :Continent = {name : "North American Continent",canada : {name : "Republic of Canada",capitalCity : "Ottawa",},us : {name : "United States of America",capitalCity : "Washington, D.C.",},mexico : {name : "United Mexican States",capitalCity : "Mexico City",},};
ts
typeCountry = {name : string;capitalCity : string;};typeContinent = {readonlyname : string;readonlycanada :Country ;readonlyus :Country ;readonlymexico :Country ;};constamerica :Continent = {name : "North American Continent",canada : {name : "Republic of Canada",capitalCity : "Ottawa",},us : {name : "United States of America",capitalCity : "Washington, D.C.",},mexico : {name : "United Mexican States",capitalCity : "Mexico City",},};
ここでContinent
のタイプエイリアスがもつプロパティはすべてreadonly
です。よって次のようなことはできません。
ts
Cannot assign to 'name' because it is a read-only property.2540Cannot assign to 'name' because it is a read-only property.america .= "African Continent"; name Cannot assign to 'canada' because it is a read-only property.2540Cannot assign to 'canada' because it is a read-only property.america .= { canada name : "Republic of Côte d'Ivoire",capitalCity : "Yamoussoukro",};
ts
Cannot assign to 'name' because it is a read-only property.2540Cannot assign to 'name' because it is a read-only property.america .= "African Continent"; name Cannot assign to 'canada' because it is a read-only property.2540Cannot assign to 'canada' because it is a read-only property.america .= { canada name : "Republic of Côte d'Ivoire",capitalCity : "Yamoussoukro",};
しかしながら、次のようなことは問題なくできてしまいます。
ts
america .canada .name = "Republic of Côte d'Ivoire";america .canada .capitalCity = "Yamoussoukro";
ts
america .canada .name = "Republic of Côte d'Ivoire";america .canada .capitalCity = "Yamoussoukro";
これはreadonly
をつけたプロパティがオブジェクトである場合に、そのオブジェクトのプロパティまでreadonly
にはしないことに起因します。
const assertion
はすべてのプロパティを固定する
as const
を付けます。
ts
constamerica = {name : "North American Continent",canada : {name : "Republic of Canada",capitalCity : "Ottawa",},us : {name : "United States of America",capitalCity : "Washington, D.C.",},mexico : {name : "United Mexican States",capitalCity : "Mexico City",},} asconst ;
ts
constamerica = {name : "North American Continent",canada : {name : "Republic of Canada",capitalCity : "Ottawa",},us : {name : "United States of America",capitalCity : "Washington, D.C.",},mexico : {name : "United Mexican States",capitalCity : "Mexico City",},} asconst ;
readonly
と同様にトップレベルのプロパティへの代入はできません。
ts
Cannot assign to 'name' because it is a read-only property.2540Cannot assign to 'name' because it is a read-only property.america .= "African Continent"; name Cannot assign to 'canada' because it is a read-only property.2540Cannot assign to 'canada' because it is a read-only property.america .= { canada name : "Republic of Côte d'Ivoire",capitalCity : "Yamoussoukro",};
ts
Cannot assign to 'name' because it is a read-only property.2540Cannot assign to 'name' because it is a read-only property.america .= "African Continent"; name Cannot assign to 'canada' because it is a read-only property.2540Cannot assign to 'canada' because it is a read-only property.america .= { canada name : "Republic of Côte d'Ivoire",capitalCity : "Yamoussoukro",};
これだけではなくオブジェクトが持つプロパティも同様にreadonly
にしてくれます。
ts
Cannot assign to 'name' because it is a read-only property.2540Cannot assign to 'name' because it is a read-only property.america .canada .= "Republic of Côte d'Ivoire"; name Cannot assign to 'capitalCity' because it is a read-only property.2540Cannot assign to 'capitalCity' because it is a read-only property.america .canada .= "Yamoussoukro"; capitalCity
ts
Cannot assign to 'name' because it is a read-only property.2540Cannot assign to 'name' because it is a read-only property.america .canada .= "Republic of Côte d'Ivoire"; name Cannot assign to 'capitalCity' because it is a read-only property.2540Cannot assign to 'capitalCity' because it is a read-only property.america .canada .= "Yamoussoukro"; capitalCity
関連情報
📄️ 型アサーション「as」
TypeScriptには、型推論を上書きする機能があります。その機能を型アサーション(type assertion)と言います。
📄️ オブジェクト型のreadonlyプロパティ
TypeScriptでは、オブジェクトのプロパティを読み取り専用にすることができます。読み取り専用にしたいプロパティにはreadonly修飾子をつけます。読み取り専用のプロパティに値を代入しようとすると、TypeScriptコンパイラーが代入不可の旨を警告するようになります。