[[型パラメーター (TypeScript)|型パラメーター]]につける `const` 修飾子。[[as const]]をつけたときと同様の[[Narrowing]]を行える。
たとえば、以下の `r` は `string`型と推論されるが、コードから見て `"foo"` `"bar"` `"baz"` のいずれかまで[[Narrowing]]できることは明らかである。
```ts
/**
* 引数のリストからランダムに1つの要素を返す関数
*/
function random<T extends unknown[]>(items: T): T[number] {
const index = Math.floor(Math.random() * items.length);
return items[index];
}
const r = random(["foo", "bar", "baz"]);
// ^? r: string
```
[[as const]]アサーションをつけることで[[Narrowing]]は可能だが、[[as const]]アサーションなしでも型エラーにはならないためつけ忘れることも多い。
```ts
const s = random(["foo", "bar", "baz"] as const);
// ^? s: "foo" | "bar" | "baz"
```
[[const型パラメーター (TypeScript)|const型パラメーター]]を使うと、呼び出し側で[[as const]]をつけなくても[[Narrowing]]される。
```ts
/**
* 引数のリストからランダムに1つの要素を返す関数
*/
function random<const T extends unknown[]>(items: T): T[number] {
const index = Math.floor(Math.random() * items.length);
return items[index];
}
const r = random(["foo", "bar", "baz"]);
// ^? r: "foo" | "bar" | "baz"
```
> [!attention]
> 変数に代入してから指定した場合は[[Narrowing]]されないので注意。後から変更不可能な[[配列リテラル (JavaScript)|配列リテラル]]とは異なり、変更できてしまうため。
>
> ```ts
> const xs = ["foo", "bar", "baz"]
> const r = random(xs);
> // ^? r: string
> ```