TypeScriptを今学習しています。
入力する引数の要素の型と、レスポンスの要素の型とが同じ関数を定義しており、
いまはany[]を利用しているのですが、外から型を注入できれば良いのではと思い。
typescriptのgenericsを活用して、定義できればと思っています。
サンプルコードにある、いかの3つを実現したいです。
- someFilter()へのジェネリクス定義
- interface Propsへのジェネリクス定義
- interface ResPropsへのジェネリクス定義
typescript
1 2interface Props{ 3 items:any[], // ★any[]を使わず、ジェネリクスを使いT[]と定義したい 4 someKey:string 5} 6interface ResProps{ 7 filteredItems:any[] // ★any[]を使わず、ジェネリクスTを使いT[]と定義したい 8} 9export const someFilter = ({items, someKey}:Props) : ResProps => { 10 11 const filteredItems = [...items].map((item)=>{ 12 // someKeyやitemsの型に基づいたitemsの何らかの加工処理 13 if(someKey === ""){ 14 return item; 15 } 16 17 // 例としてこんなかんじ 18 if(item["name"] === undefined){ 19 return item 20 }else{ 21 item["name"] = item["name"] + "様" 22 } 23 24 if(item[someKey] === undefined){ 25 return item 26 }else{ 27 item["name"] = item["name"] + someKey 28 } 29 return item 30 }) 31 32 return { 33 filteredItems 34 } 35}
関数を利用するスクリプトはこんな感じです。
typescript
1//例1 2interface Author{ 3 id: number, 4 name: string; 5} 6 7const authorItems:Author[] = getItems("author"); // 引数に応じてなんらかのリストを取得 8const {filteredItems} = someFilter({items: authorItems, someKey:"name"}) 9//↓こうしたい 10const {filteredItems} = someFilter<Author>({items: authorItems, someKey:"name"})
typescript
1//例2 2interface Post{ 3 id: number, 4 title: string; 5} 6const postItems:Post[] = getItems("post"); 7const {filteredItems} = someFilter({items: postItems, someKey:"title"}) 8//↓こうしたい 9const {filteredItems} = someFilter<Post>({items: postItems, someKey:"title"})
typescript
1//例3 2const stringItems: string[] = ['コーラ','ソーダ']; 3const {filteredItems} = someFilter({items: stringItems, someKey:""}) 4//↓こうしたい 5const {filteredItems} = someFilter<string>({items: stringItems, someKey:""})
次のように、<T extends {}>などの定義で解決しそうな感じもしたのですが、
加工処理でエラーが発生してしまいました。
TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'. No index signature with a parameter of type 'string' was found on type '{}'. TS7053: Element implicitly has an 'any' type because expression of type '"name"' can't be used to index type '{}'. Property 'name' does not exist on type '{}'
TypeScript
1// typescirptのエラーが生じるコード 2 3interface Props<T>{ 4 items:T[], 5 someKey:string 6} 7interface ResProps<T>{ 8 filteredItems:T[] 9} 10export const someFilter = <T extends {}>({items, someKey}:Props<T>) : ResProps<T> => { 11 12 const filteredItems = [...items].map((item)=>{ 13 // ここでTypeScriptのErrorが発生します。 14 15 if(someKey === ""){ 16 return item; 17 } 18 19 // 例としてこんなかんじ 20 if(item["name"] === undefined){ 21 return item 22 }else{ 23 item["name"] = item["name"] + "様" 24 } 25 26 if(item[someKey] === undefined){ 27 return item 28 }else{ 29 item["name"] = item["name"] + someKey 30 } 31 return item 32 33 return items; 34 }) 35 36 return { 37 filteredItems 38 } 39}
アドバイスをお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/16 03:43 編集
2020/10/16 04:51
2020/10/16 04:54
2020/10/17 06:32