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 🌹

もちろん interfacetypeの定義に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です。たとえば、あなたのPropsStateには不変(immutable)であるとマークすることができます:

しかし、Reactの型定義として、これらをreadonlyとしてマークする必要はありません。Reactは既に内部でそれを行っています。

シームレスな不変性(Seamless Immutable)

インデックスのシグネチャをreadonlyとしてマークすることもできます:

ネイティブのJavaScript配列を不変的(immutable)な方法で使用したいと思うことは、素晴らしいことです。実際、ちょうどそのためにTypeScriptにはReadonlyArray<T>インターフェースが付属しています。

自動推論

場合によっては、コンパイラは、特定の項目を読み込み専用に自動的に推論することができます。例えば、クラス内でgetterしか持たずsetterを持たないプロパティは、読み取り専用とみなされます。

constとの相違点

const

  1. 変数参照に利用するものである

  2. 他の値を再度割り当てることはできない

readonly

  1. プロパティに利用するものである

  2. エイリアシングによってプロパティが変更されることがありえる

説明のためのサンプル1:

説明のためのサンプル2:

基本的に readonlyは、プロパティを私が変更することはできないことを保証しますが、(型互換性のための理由で)その保証を持たない人にそれを渡すと、変更できてしまいます。もちろん、iMutateFooが「foo.barに変更を加えない」と言っている場合、コンパイラは以下のように正しくエラーフラグを立てます:

最終更新

役に立ちましたか?