やりたいこと
以下の関数をTypeScriptで型定義したい。
javascript
1/** 2 * const original = { 3 * a: 1, 4 * b: 'WOW', 5 * c: new Date(2019, 1, 1, 0, 0, 0), 6 * }; 7 * 8 * const mapping = { 9 * a: 'hello', 10 * b: 'world', 11 * c: '!!!' 12 * }; 13 * 14 * > remap(original, mapping); 15 * { 16 * hello: 1, 17 * world: 'WOW', 18 * '!!!': new Date(2019, 1, 1, 0, 0, 0) 19 * } 20 */ 21const remap = (original, mapping) => { 22 const remapped = {}; 23 Object.keys(original).forEach(k => { 24 remapped[mapping[k]] = original[k]; 25 }); 26 return remapped; 27};
環境
- TypeScript playgroundで実行(2019/04/01時点でバージョン3.3.1)
- オプション(noImplicitAny,strictNullChecks,strictFunctionTypes,strictPropertyInitialization,noImplicitThis,noImplicitReturns)はすべてチェック
試してみたもの
playground
※teratailのエディタでは表示できないので、コードブロックで記載しています https://www.typescriptlang.org/play/#src=export%20const%20remap%20%3D%20%3C%0D%0A%20%20T%20extends%20%7B%20%5Bkey%3A%20string%5D%3A%20any%20%7D%2C%0D%0A%20%20U%20extends%20%7B%20%5BnewKey%3A%20string%5D%3A%20keyof%20T%20%7D%0D%0A%3E(original%3A%20T%2C%20mapping%3A%20U)%20%3D%3E%20%7B%0D%0A%20%20const%20remapped%3A%20any%20%3D%20%7B%7D%3B%0D%0A%0D%0A%20%20Object.keys(original).forEach(k%20%3D%3E%20%7B%0D%0A%20%20%20%20remapped%5Bmapping%5Bk%5D%5D%20%3D%20original%5Bk%5D%3B%0D%0A%20%20%7D)%3B%0D%0A%0D%0A%20%20%2F%2F%20%E4%BB%A5%E4%B8%8B2%E7%82%B9%E3%82%92%E6%94%B9%E5%96%84%E3%81%97%E3%81%9F%E3%81%84%20%0D%0A%20%20%2F%2F%20-%20remapped%E3%82%92any%E3%81%A7%E5%AE%A3%E8%A8%80%E3%81%97%E3%81%A6%E5%BC%B7%E5%BC%95%E3%81%ABcast%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%0D%0A%20%20%2F%2F%20-%20%E5%80%A4%E3%81%8Cany%E3%81%A7%E5%AE%A3%E8%A8%80%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%0D%0A%20%20return%20remapped%20as%20%7B%20%5BP%20in%20keyof%20U%5D%3A%20any%20%7D%3B%0D%0A%7D%3B%0D%0A%0D%0Aconst%20test%20%3D%20remap(%0D%0A%20%20%7B%20a%3A%201%2C%20b%3A%20'txt'%2C%20c%3A%20new%20Date()%20%7D%2C%0D%0A%20%20%7B%20x%3A%20'a'%2C%20y%3A%20'b'%2C%20z%3A%20'c'%7D%0D%0A)%3B
typescript
1export const remap = < 2 T extends { [key: string]: any }, 3 U extends { [newKey: string]: keyof T } 4>(original: T, mapping: U) => { 5 const remapped: any = {}; 6 7 Object.keys(original).forEach(k => { 8 remapped[mapping[k]] = original[k]; 9 }); 10 11 // 以下2点を改善したい 12 // - remappedをanyで宣言して強引にcastしている 13 // - 値がanyで宣言されている, Tの型から導出したい 14 return remapped as { [P in keyof U]: any }; 15}; 16 17const test = remap( 18 { a: 1, b: 'txt', c: new Date() }, 19 { x: 'a', y: 'b', z: 'c'} 20);
追記 Stack Overflowにも記載
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。