Readonly
readonly
TypeScriptの型システムでは、インターフェース上の個々のプロパティをreadonlyとしてマークすることができます。これにより、関数的に作業することができます(予期しない変更は良くありません)。
function foo(config: {
readonly bar: number,
readonly bas: number
}) {
// ..
}
let config = { bar: 123, bas: 123 };
foo(config);
// You can be sure that `config` isn't changed 🌹もちろん interfaceとtypeの定義にreadonlyを使うこともできます:
type Foo = {
readonly bar: number;
readonly bas: number;
}
// Initialization is okay
let foo: Foo = { bar: 123, bas: 456 };
// Mutation is not
foo.bar = 456; // Error: Left-hand side of assignment expression cannot be a constant or a read-only propertyクラスプロパティをreadonlyとして宣言することもできます。次のように、宣言箇所またはコンストラクタで初期化することができます。
Readonly
Readonly型はT型をとり、そのすべてのプロパティをreadonlyとマークします。以下にデモを示します:
さまざまな使用例
ReactJS
不変性(Immutabillity)を愛するライブラリの1つがReactJSです。たとえば、あなたのPropsとStateには不変(immutable)であるとマークすることができます:
しかし、Reactの型定義として、これらをreadonlyとしてマークする必要はありません。Reactは既に内部でそれを行っています。
シームレスな不変性(Seamless Immutable)
インデックスのシグネチャをreadonlyとしてマークすることもできます:
ネイティブのJavaScript配列を不変的(immutable)な方法で使用したいと思うことは、素晴らしいことです。実際、ちょうどそのためにTypeScriptにはReadonlyArray<T>インターフェースが付属しています。
自動推論
場合によっては、コンパイラは、特定の項目を読み込み専用に自動的に推論することができます。例えば、クラス内でgetterしか持たずsetterを持たないプロパティは、読み取り専用とみなされます。
constとの相違点
constとの相違点const
変数参照に利用するものである
他の値を再度割り当てることはできない
readonly
プロパティに利用するものである
エイリアシングによってプロパティが変更されることがありえる
説明のためのサンプル1:
説明のためのサンプル2:
基本的に readonlyは、プロパティを私が変更することはできないことを保証しますが、(型互換性のための理由で)その保証を持たない人にそれを渡すと、変更できてしまいます。もちろん、iMutateFooが「foo.barに変更を加えない」と言っている場合、コンパイラは以下のように正しくエラーフラグを立てます:
最終更新
役に立ちましたか?