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

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

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

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

Q&A

解決済

1回答

990閲覧

typescript 型ガードで複数のユニオン型で絞り込みたい

yochun02

総合スコア76

TypeScript

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

0グッド

1クリップ

投稿2022/01/11 16:12

編集2022/01/11 16:15

typescriptの型ガードを使って、オブジェクトの型(リテラルによる型ガードを利用)を出し分けたいのですが、一つずつ絞り込むのではなく複数で絞り込みを行うことは出来ますか?

typescript

1 2type MultiType = TypeA | TypeB | TypeC | TypeD 3 4interface TypeA { 5 type: "A", 6 propA: {...} 7} 8 9interface TypeB { 10 type: "B", 11 propB: {...} 12} 13 14interface TypeC { 15 type: "C", 16 propC: {...} 17} 18 19interface TypeD { 20 type: "D", 21 propD: {...} 22} 23 24function checkType(what: MultiType) { 25 if(what.type === "A" || "B") { 26 ... // (1) 27 } else { 28 ... // (2) 29 } 30} 31

上記コードにおける関数checkType内で型毎に処理をしたいのですが、(1), (2)での引数whatの型がそれぞれ
(1) what: TypeA | TypeB
(2) what: TypeC | TypeD
となることを期待しますが、結果は
(1) what: MultiType
(2) what: TypeB | TypeC | TypeD
となってしまい困っています。型ガードは1つずつの絞り込みしかできないのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

これは型がどうというワケではなく、単に文字列比較をしているコードだと思います。

typescript

1const hoge = "A" || "B"

上記は、左辺がundefinedfalse0なら"B"、という、javascriptからある書き方です。なので、

typescript

1if(what.type === "A" || "B") {

これは常に"A"と比較してる事になります。
これは what.type === "A" が false の場合に"B"(つまり常にtrue) という式になります。

文字比較としてなら、以下のように書けます。

typescript

1 if(["A", "B"].includes(what.type)){ 2 .... 3 } else { 4 .... 5 }

投稿2022/01/11 17:14

編集2022/01/12 10:03
umau

総合スコア831

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

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

maisumakun

2022/01/12 04:17

> これは常に"A"と比較してる事になります。 比較はしていますが、偽だった場合には'B'が取られ、条件としてはつねに真となります。
yochun02

2022/01/12 08:58

> 型がどうというワケではなく、単に文字列比較をしているコード 初歩的なことを忘れていました;; if(what.type ==="A" || what.type==="B"){ ... } とすることで、ifの中でのwhatの型が期待通りTypeA | TypeBになりました。ありがとうございます。
umau

2022/01/12 09:57

> maisumakun さん おっしゃるとおりで、僕が評価順ミスってる説明してますね。 (what.type === "A" ) || "B" 〇 what.type === ("A" || "B") ✕ ですね。ありがとうございます。 > yochun02 さん 解決できて良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問