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

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

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

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

Q&A

2回答

2120閲覧

typescript 複数の型(オブジェクト)を返す関数を作りたい

yochun02

総合スコア76

TypeScript

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

0グッド

0クリップ

投稿2022/01/04 01:23

編集2022/01/04 01:26

以下のような実装では、別々のプロパティを持ったオブジェクト型の返り値を返す関数を定義したいのですが、ユニオン型だと呼び出しの時点で両方共通するプロパティしかアクセスすることができません。関数実行時に各オブジェクトを特定するような関数を作ることは出来ないでしょうか?

typescript

1interface TypeA { 2 name: 'A' 3 num: number 4} 5interface TypeB { 6 name: 'B' 7 str: string 8} 9 10function selectType(t: 'A' | 'B'): TypeA | TypeB | undefined { 11 if(t === 'A') return {name: 'A', num: 1} 12 13 if(t === 'B') return {name: 'B', str: "hoge"} 14 15 return undefined 16} 17 18console.log(selectType('A').name) // A 19console.log(selectType('B').name) // B 20 21 22/* Property 'num' does not exist on type 'TypeA | TypeB'. 23 Property 'num' does not exist on type 'TypeB' */ 24console.log(selectType('A')?.num) // error -> 期待値: 1 25 26console.log(selectType('B')?.str) // error -> 期待値: hoge 27 28

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

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

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

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

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

guest

回答2

0

まず引数を'A'か'B'に絞ってるのにAB以外を考慮してundefinedを返すのは、型で制限する意味が無いと思うので、そこは省いての案です。

typescript

1 2type Ret<T> = T extends 'A' ? TypeA : TypeB 3 4function selectType<T extends 'A' | 'B'>(t: T): Ret<T> { 5 return (t === 'A' ? {name: 'A', num: 1} : {name: 'B', str: "hoge"}) as Ret<T> 6} 7

投稿2022/01/04 03:11

umau

総合スコア805

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

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

0

selectTypeがどのように使われるかわからないので、原型をなるべく保持するとしたら、asを使えば要件は満たせるかもしれません。

console.log((selectType('A') as TypeA)?.num) // 1 console.log((selectType('B') as TypeB)?.str) // hoge

投稿2022/01/04 01:37

編集2022/01/04 03:18
wsb

総合スコア194

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問