## 事象
`names` は `string[]` に推論されるが、`["Tom", "Anna", "John"]` に推論されてほしい。
```ts
function returnNames<T extends string[]>(names: T): T {
return names;
}
const names = returnNames(["Tom", "Anna", "John"]);
// ^ const names: string[]
```
### 環境
| 対象 | バージョン |
| -------------- | ---------- |
| [[TypeScript]] | 5.9.2 |
| [[Deno]] | 2.5.6 |
## 原因
[[as const]]をつけていないため、`string[]` に[[Widening]]されるから。
## 解決方法
### 方法1
[[as const]]をつける。
```ts
function returnNames<T extends string[]>(names: T): T {
return names;
}
const names = returnNames(["Tom", "Anna", "John"] as const);
```
### 方法2 #✨推奨
方法1だと今回のように忘れてしまう可能性があるので、[[const型パラメーター (TypeScript)|const型パラメーター]]を使ったほうがよい。
```ts
function returnNames<const T extends string[]>(names: T): T {
return names;
}
const names = returnNames(["Tom", "Anna", "John"]);
```
[[ReadonlyArray (TypeScript)|ReadonlyArray]]にしておくほうがもっと安全。
```ts
function returnNames<const T extends readonly string[]>(names: T): T {
return names;
}
const names = returnNames(["Tom", "Anna", "John"]);
```