🧪

TypeScriptのconst assertionをちゃんと理解したい

2022/03/23に公開

const assertionって?

const assertionを利用することのメリットは2つあります。

  • readonlyにできる
  • Literal TypesがWideningされない

実際のコードを見ながら理解していきましょう。

書き方

const user = {
  name: 'Haruki',
  age: 99
} as const

オブジェクトの末尾にas const付け加えるだけ。
readonlyなので、オブジェクトの値の変更はできません。

userInfo.name = 'Harry'
// Cannot assign to 'name' because it is a read-only property.

この『readonlyなので、オブジェクトの値の変更はできません。』という部分が非常に重要です。
これにより、 オブジェクトの値が変更できない = オブジェクトの値の型が変更できない ということになるので、Literal TypesのWideningが行われません。もう型推論によって勝手にstring型やnumber型などになりません。

ちなみに配列でも同様です。

const userGroup = ['Haruki', 'Harry', 'Lily', 'Baker'] as const

readonlyなので値の変更はできません。

userGroup[0] = 'Tom'
// Cannot assign to '0' because it is a read-only property.

readonlyとの違いは?

TypeScriptには以下のようなreadonlyの書き方があります。

type userInfo = {
  readonly name: string;
  readonly age: number;
};

const assetionとどう違うのかというと、readonlyはプロパティごとに宣言できるのに対し、const assetionはオブジェクト全体に宣言します。

Discussion