## 事象 `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"]); ```