質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

950閲覧

TypeScript Objectのキーをremappingする関数の型定義

退会済みユーザー

退会済みユーザー

総合スコア0

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

1クリップ

投稿2019/04/01 10:03

編集2019/04/01 11:33

やりたいこと

以下の関数を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にも記載

TypeScript: remapping object properties in typesafe

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Stack Overflowで回答をいただいたのでクローズします。

投稿2019/04/03 00:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問