前提
(直接関係のないことが長くつづくので、端的に把握していただくなら「実現したいこと」から見ていただけると幸いです。)
TypeScriptで、ジェネリクスを使った関数にデフォルト引数を指定したプログラムを書こうとしています。
具体的には"yyyy-mm-dd"から
{ year: +yyyy, month: +mm, day: +dd }
のようなものをデフォルトで返す関数を作成しております。
この関数は、状況に応じて例えばmm
を
month: { value: number; isLeap: boolean; }
の形式にパースする関数
(str: string) => { value: number; isLeap: boolean; }
を引数で渡すことができます。
このような関数を作成する際、大本となる以下のコードを作成した時にエラーが発生しました。
ts
1function parseXFromString<T>( 2 xStr: string, 3 parser: ((str: string) => T) = ((str: string) => +str) 4): { x: T } { 5 return { x: parser(xStr) }; 6}
エラーメッセージ
3行目: parser: ((str: string) => T) = ((str: string) => +str)
の部分
'T' could be instantiated with an arbitrary type which could be unrelated to 'number'
つきつめると、ジェネリクス関数で以下のようにデフォルト引数を指定した時にエラーとなることが分かりました。
ts
1function f<T>(x: T = "default"): T { 2 return x; 3}
エラーメッセージ
1行目 x: T = "default"
の部分
'T' could be instantiated with an arbitrary type which could be unrelated to 'string'.
実現したいこと
- 「#該当のソースコード」で、デフォルト引数
"default"
より、デフォルトではT
をstring
とするデフォルト引数を指定したジェネリクス関数を作成したい
自分のジェネリクスへの理解不足による問題だと思いますが、こういうことは不可能(デフォルト引数に指定した型は型引数のデフォルトと互換性がなく型引数のデフォルトにならない)なら教えていただけると幸いです。よろしくお願いします。
発生している問題・エラーメッセージ
ジェネリクス関数で型引数を用いたデフォルト引数を指定した時に、型引数T
がデフォルト引数の型string
になることなく以下のエラーとなる
1行目 x: T = "default"
の部分
'T' could be instantiated with an arbitrary type which could be unrelated to 'string'.
該当のソースコード
ts
1function f<T>(x: T = "default"): T { 2 return x; 3}
試したこと
- 以下のようにデフォルト引数と同じ型
string
を型引数T
のデフォルト引数とするなどしたがうまく行かなかった
ts
1function f<T = string>(x: T = "default"): T { 2 return x; 3}
- デフォルト引数でなく指定した場合はエラーが出なかった
ts
1function f<T>(x: T): T { 2 return x; 3} 4 5f("default");
- Denoの問題かとTS Playgroundで試したが同様のエラーが出た
補足情報(FW/ツールのバージョンなど)
OS: Windows11
Runtime: Deno 1.23.2 (release, x86_64-pc-windows-msvc)
TypeScript: 4.7.2

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/09/04 15:19