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

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

新規登録して質問してみよう
ただいま回答率
85.35%
型推論

型推論とは、コンパイラが型を自動で判断する機能を指します。メソッド内のローカル変数の宣言時に型宣言の代わりに指定することで、コードの記述量を減らすことが可能。変数や関数シグネチャに型を宣言せずとも、早期にエラーをチェックできるというメリットもあります。

TypeScript

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

Q&A

解決済

1回答

1748閲覧

typescript でとある型Aのオブジェクトから、とある型Bのオブジェクトのプロパティの値のみを抽出したい

kuwakuw

総合スコア1

型推論

型推論とは、コンパイラが型を自動で判断する機能を指します。メソッド内のローカル変数の宣言時に型宣言の代わりに指定することで、コードの記述量を減らすことが可能。変数や関数シグネチャに型を宣言せずとも、早期にエラーをチェックできるというメリットもあります。

TypeScript

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

0グッド

0クリップ

投稿2021/11/01 10:56

前提・実現したいこと

typescript でとある型Aのオブジェクトからとある型Bのオブジェクトのプロパティの値のみを抽出したい

type User = { id: number, name: string, address: string, } type Person { id: number, name: string, sex: string } /** イメージ(もちろんNGです) */ const getAnyResponse = (objectsData: User): Person => { return response as Person; } ◆期待している値: {id: 1, name: 'takashi', sex: undefined} ◆実際に取得する値: {id: 1, name: 'takashi', address: 'aaa@gmail.co.jp'}

上記のように、type Userのデータをtype Personに存在するパラメータのみを抽出して取得したいのですが、
どうにもtype Userのデータがそのまま取得してしまいます。
スプレッド構文やキャストなど色々試しましたが厳しかったので、どなたか教えてもらえませんか?

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

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

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

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

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

maisumakun

2021/11/01 11:43

そもそも論として、sex: undefinedはPerson(sex: string)にマッチしません。
kuwakuw

2021/11/01 23:51

はい、コメントに記載している通りあくまでイメージとなります。 アンマッチなので上記のようなことをしたいのです。
guest

回答1

0

ベストアンサー

ふーん…
自分なら、どうするかなあ。

型の定義のほうに

diff

1 type User = { 2 id: number; 3 name: string; 4 address: string; 5 } 6 7 type Person = { 8 id: number; 9 name: string; 10 sex: string; 11 } 12 13+ const BLANK_PERSON: Person = { 14+ id: 0, 15+ name: '', 16+ sex: '', 17+ } as const; 18+ 19+ const PERSON_PROPS = Object.freeze(Object.keys(BLANK_PERSON)); 20

とかっていうのを追加しておき、実際にUser型のオブジェクトからPersonと共通のプロパティだけを抜き出したPartial<User> なオブジェクトを得るほうは、lodash の pick を使って、

typescript

1const user: User = { 2 id: 10, 3 name: 'hoge', 4 address: 'Tokyo' 5}; 6 7const partialUser = _.pick(user, PERSON_PROPS);  // => { id: 10, name: "hoge" }

ってやっちゃうかなと ????サンプル

投稿2021/11/01 12:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kuwakuw

2021/11/01 23:55

ご回答ありがとうございます。 すみません、情報を追加させていただきますと、上記のようなオブジェクトが多数あり、 このような空オブジェクトを一つずつ作成するのがおっくうだったので質問させていただきました。 可能ならば、type User 、type Personなど、不特定のtype2種類から抽出できる汎用的な関数を作成したいと思っています。
maisumakun

2021/11/02 00:12

> 可能ならば、type User 、type Personなど、不特定のtype2種類から抽出できる汎用的な関数を作成したいと思っています。 それは、トランスパイラレベルで仕掛けをするなど、通常のTypeScriptを超えた領域に突っ込まない限り困難です。TypeScriptの型はトランスパイルで消えてしまうので、実行時に型情報を元としてコードを動かすことはできません。
退会済みユーザー

退会済みユーザー

2021/11/02 13:07

maisumakunさん フォロー、ありがとうございます。 kuwakuwさん なるほどですね〜。ですが、maisumakunさんのおっしゃるとおり、現状で標準のTypescriptで与えられている機能群の中では出来ないです。 kuwakuwさんの作りたい関数を書けるようになるのは、いってみれば type User = { id: number; name: string; address: string; }; という型を定義した後に、たとえば const userProps = props@User; などと書いておくと、この行がトランスパイル後に、 const userProps = ["id", "name", "address"] as const; に置き換わるという新しい機能がTypescriptに装備されることに近いと思います。あったら便利になるかも?という気はしますが、現状ではこういうのは無いですね。 > 上記のようなオブジェクトが多数あり、 このような空オブジェクトを一つずつ作成するのがおっくうだった という状況だったら、自分なら、ソースファイルの中で型を定義している部分 type Person = { id: number; name: string; sex: string; } を読みとって、これから const BLANK_PERSON: Person = { id: 0, name: '', sex: '', } as const; というテキストを出力するプリプロセッサ(コマンドラインツール)を作っておいて、うまくビルドプロセスに組み込めないか?と妄想するかもしれません。
kuwakuw

2021/11/03 22:51

kilesa様、maisumakun様ご回答ありがとうございます。 上記のような実現が厳しいことを理解いたしました。 あったら便利かもと思う反面、typescriptの思想やアンチパターンなのかな? と質問に反した思いもありました。 自分なりにすっきりしたのでこちらでクローズとさせていただきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問