以下の様にオブジェクトのリストを生成して返すメソッドを実装しましたが一部エラーが出る部分があります。
TypeScript
1export const getHogeObject = <T, U>( 2 id: T, 3 sortPattern: 'desc' | 'asc' 4): U[] => { 5 let hogeObject: U[] 6 hogeObject = [{ [id]: sortPattern }] as U[] //<= 計算されたプロパティ名は 'string' 型、'number' 型、'symbol' 型、または 'any' 型のいずれかでなければなりません 7 return hogeObject 8}
そこで[id]の部分を [id as any]: とすると今度はas U[]ができないので最終的に以下の様にするとエラーは消えます。
TypeScript
1export const getHogeObject = <T, U>( 2 id: T, 3 sortPattern: 'desc' | 'asc' 4): U[] => { 5 let hogeObject: U[] 6 hogeObject = [{ [id as any]: sortPattern }] as any as U[] 7 return hogeObject 8}
この様にジェネリスクスで型を選べるようにする場合は何かとasによるキャストが多発するのは仕方ない事なのでしょうか?
ロジック一つ切り抜くにしてもこの様に一旦anyに変換してから目的の型にするなどしなくて良い方法などありますか??
--------追記-----------
ご回答でご指摘いただいた件で追記させていただきます。
以下について
Record<T, 'desc' | 'asc'>[]のようにすればいいかと思います。
TypeScript
1export const getHogeObject = <T extends Hoge|Huga|Piyo>( 2 id: T, 3 sortPattern: 'desc' | 'asc' 4): Record<T, 'desc' | 'asc'>[] => {
上記のように宣言するという事であっていますでしょうか?
こちらのメソッドでは戻り値の型を元々U[]としていましたが、これはtype A|B|C|Dの様なABCDどれかが引数の型Hoge,Huga,Piyoどれかによって返る想定でした。その場合確かにRecord<T, 'desc' | 'asc'>[]とA[],B[],C[],D[]は同義ですがメソッドの返り値を受け取った先でまた以下の様にキャストする必要があるという事にならないないでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/03 00:57
2022/01/03 01:26
2022/01/03 01:27
2022/01/03 04:25
2022/01/03 04:35
2022/01/03 08:46