[[object型 (TypeScript)|object型]]や[[配列 (JavaScript)|配列]]の値を変更不可にするサフィックス。[[object型 (TypeScript)|object]]に対して[[as const]]を利用した場合、以下のように[[イミュータブル]]になる。ネストした[[プロパティ (TypeScript)|プロパティ]]にも効果がある。
```ts
const obj = {
id: 1,
name: "one",
nested: {
flag: true
}
} as const
// Cannot assign to 'id' because it is a read-only property.ts(2540)
obj.id = 2
// Cannot assign to 'flag' because it is a read-only property.(2540)
obj.nested.flag = false
```
<button class="playground"><a href="https://www.typescriptlang.org/play?#code/MYewdgzgLgBCBGArGBeGBvAUDGBLAJgFwwCMANNjGAIYC2ApsQETj1MU5j3T1EaU4AZgBtqAc2JQATgFd6lAL6YFMahBihIUTJgD0umAGFqYMCFhqIuMWBhQQMAOQFHMePWDUZEenli51ahgpemp8AFpwYQBPGAAHKRA4+ikoaIA6KAgACgAmAFYAFgAGAEpMBER0glQYXL0DY1NzVQgrGzsHRxFxV3dPb19cf0Dg0Iio2ISklLT0vKKyiqR0rh58dJ6xWsFqYR9MIA">Playground</a></button>
また、`obj.id`は型`1`として推論される。`obj.id`が[[イミュータブル]]になったためだ。[[as const]]を利用しない場合、`obj.id`は後からでも書き換え可能であるため、`number`と推論される。
```ts
const obj = {
id: 1,
name: "one"
} as const
// objはimmutableなので、obj.idは1と推論される
obj.id
// ^?
const obj2 = {
id: 1,
name: "one"
}
// obj2はmutableなので、obj2.idはnumberと推論される
obj2.id
// ^?
```
<button class="playground"><a href="https://www.typescriptlang.org/play?#code/MYewdgzgLgBCBGArGBeGBvAUDGBLAJgFwwCMANNjGAIYC2ApsQETj1OYC+M1EMokUTJgD0wuEkD2DLlq0ArlGrwANvUBWDIDsGQOYMgQAYEiAHQEJJQBYMgCuNAa1GBVBkAxDIGiGTHsP4RYnAD0A-EP7RxiACZUDEoCYnJKGgZmVnYOIVF-AIk5BWU1LV0kAOcJMFlaeHoAJ3Nre0ds51ccGC8gA">Playground</a></button>
## [[as const]]で[[Enum (TypeScript)|Enum]]の等価表現
```ts
const enum Direction {
Up,
Down,
}
```
は
```ts
const Direction = {
Up: 0,
Down: 1,
} as const;
```
と書ける。
## MOC
- 📒**関連**
- [[なぜsatisfies演算子を使うのか?]]
- 📜**アクティビティ**
- 📝**トラブルシューティング**