前提
まず、「指定されたキーに値を詰めたオブジェクトを生成する関数」を生成する関数がJavaScriptであります。
js
1const makeObject = key => val => ({[key]: val})
この関数を素直にTypeScriptにすると、以下のようなジェネリクスが出来上がります。
ts
1const makeObject = <T, K extends string>(key: K) => (val: T) => ({[key]: val})
実現したいこと
上の型付けの場合、makeObject
の型引数は「2つとも指定するか、両方を推論させるか」ということになってしまいます。K
にはリテラルを与えて型が明らかな場面も多いので、K
は推論に任せてT
だけを指定させたいのです。
問題点・試したこと
そのままmakeObject<number>('key')
と書くと、Expected 2 type arguments, but got 1.
と個数が足りずエラーとなります。
K extends string = ''
のように適当なデフォルト型を与える手段を取ってみると、Argument of type '"key"' is not assignable to parameter of type '""'.
と型の不一致でエラーとなってしまいます。
その他
最終的に「型引数1つ、リテラル1つの指定で結果の関数が得られる」関数を書けるなら、makeObject
の型指定を変えるだけでなく、makeObject
自体の構造を変える手段も問題ないです。
補足情報(FW/ツールのバージョンなど)
"typescript": "^5.7.2"
回答1件
あなたの回答
tips
プレビュー