readonlyとconstの違い
JavaScriptでは、const
で宣言した変数は代入不可になります。TypeScriptではオブジェクト型のプロパティにreadonly
修飾子をつけると、そのプロパティが代入不可になります。これら2つの機能は「代入不可」という点では似ています。ではこれらの違いは何でしょうか。
#
constは変数への代入を禁止にするものconst
は変数への代入を禁止するものです。たとえば、const
で宣言されたxに値を代入しようとすると、TypeScriptではコンパイルエラーになり、JavaScriptでは実行時エラーになります。
ts
constx = 1;Cannot assign to 'x' because it is a constant.2588Cannot assign to 'x' because it is a constant.= 2; x
ts
constx = 1;Cannot assign to 'x' because it is a constant.2588Cannot assign to 'x' because it is a constant.= 2; x
const
の代入禁止が効くのは変数そのものへの代入だけです。変数がオブジェクトだった場合、プロパティへの代入は許可されます。
ts
constx = {y : 1 };Cannot assign to 'x' because it is a constant.2588Cannot assign to 'x' because it is a constant.= { x y : 2 }; // 変数そのものへの代入は不可x .y = 2; // プロパティへの代入は許可
ts
constx = {y : 1 };Cannot assign to 'x' because it is a constant.2588Cannot assign to 'x' because it is a constant.= { x y : 2 }; // 変数そのものへの代入は不可x .y = 2; // プロパティへの代入は許可
#
readonlyはプロパティへの代入を禁止にするものTypeScriptのreadonly
はプロパティへの代入を禁止するものです。たとえば、readonly
がついたプロパティxに値を代入しようとすると、コンパイルエラーになります。
ts
letobj : { readonlyx : number } = {x : 1 };Cannot assign to 'x' because it is a read-only property.2540Cannot assign to 'x' because it is a read-only property.obj .= 2; x
ts
letobj : { readonlyx : number } = {x : 1 };Cannot assign to 'x' because it is a read-only property.2540Cannot assign to 'x' because it is a read-only property.obj .= 2; x
一方、変数自体への代入は許可されます。
ts
letobj : { readonlyx : number } = {x : 1 };obj = {x : 2 }; // 許可される
ts
letobj : { readonlyx : number } = {x : 1 };obj = {x : 2 }; // 許可される
#
constとreadonlyの違いconst
は変数自体を代入不可するものです。変数がオブジェクトの場合、プロパティへの代入は許可されます。一方、readonly
はプロパティを代入不可にするものです。変数自体を置き換えるような代入は許可されます。以上の違いがあるため、const
とreadonly
を組み合わせると、変数自体とオブジェクトのプロパティの両方を変更不能なオブジェクトを作ることができます。
ts
constobj : { readonlyx : number } = {x : 1 };Cannot assign to 'obj' because it is a constant.2588Cannot assign to 'obj' because it is a constant.= { obj x : 2 };Cannot assign to 'x' because it is a read-only property.2540Cannot assign to 'x' because it is a read-only property.obj .= 2; x
ts
constobj : { readonlyx : number } = {x : 1 };Cannot assign to 'obj' because it is a constant.2588Cannot assign to 'obj' because it is a constant.= { obj x : 2 };Cannot assign to 'x' because it is a read-only property.2540Cannot assign to 'x' because it is a read-only property.obj .= 2; x