typescript の widening と「const と readonly」の違い

● typescript の widening

こちらにとても上手な説明があります https://qiita.com/yamashin0616/items/f6f2405dba4570638228

(引用させていただきました。 ↑ )

// 例1 : constでLiteral Typesの型を宣言(Widening発生)
const foo: "foo" = "foo"; // Literal Typesの型を宣言
let bar = foo; // 変数fooを変数barに代入
bar = "bar"; // WideningによりErrorにならない
// 例2 : letでLiteral Typesの型を宣言(Wideningが発生しない)
let foo: "foo" = "foo"; // Literal Typesの型を宣言
let bar = foo; // 変数fooを変数barに代入
bar = "bar"; // 変数barの値は"foo"で固定されているため、Errorになる
// 例3 : as constでLiteral Typesの型を宣言(Wideningが発生しない)
const foo = "foo" as const; // as constで変数fooのLiteral Typesの型を宣言
let bar = foo; // 変数fooを変数barに代入
bar = "bar"; // 変数barの値は"foo"で固定されているため、Errorになる

const

一度定義した後の再代入を禁止する

const hoge1:number = 123;
hoge1 = 999;  // エラー

readonly

オブジェクト型のプロパティにreadonly修飾子をつけることで使用できる。つまりプロパティ以外には使用できない。
ただオブジェクト自体を再代入して書き換えることはできる

type User = {
  readonly id: number;
  readonly name: string;
};

let user01:User = {
  id: 1,
  name:"Taro Yamada",
}

// エラー:読み取り専用プロパティであるため、'id' に代入することはできません。
user01.id = 2;  

// OK
user01 = {
  id: 999,
  name:"Taro Nise",
}

参考 : https://bit.ly/3WzR70F

No.2266
12/22 11:21

edit