[[型パラメーター (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 > ```