🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
TypeScript

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

Q&A

解決済

1回答

612閲覧

なぜ型エラーが起きるのかわかりません。。。【TypeScript】

TuTettuuu

総合スコア12

TypeScript

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

0グッド

0クリップ

投稿2020/12/05 07:08

前提・実現したいこと

https://www.typescriptlang.org/play で以下を試していたのですが、何が型エラーの原因になっているのか分からなかったので原因が知りたいです。教えてください。
※ version は v 4.1.2 で試しています。

発生している問題・エラーメッセージ

type A = { items: { itemId: 100 | 200; }[]; upperCode: 'A'; lowerCode: 'a'; }; type B = { items: { itemId: 100 | 200; }[]; upperCode: 'B'; lowerCode: 'b'; }; type AorB = (A | B) const func = ( raws: AorB[], code: string ) => { // ここで型エラーがおきました。 const ret: AorB[] = raws.map( raw => { if (raw.upperCode === code) { return { items: raw.items, upperCode: raw.upperCode, lowerCode: raw.lowerCode } } return raw; }) return ret }

型エラーの内容は↓

Type '{ items: { itemId: 100 | 200; }[] | { itemId: 100 | 200; }[]; upperCode: "A" | "B"; lowerCode: "a" | "b"; }[]' is not assignable to type 'AorB[]'. Type '{ items: { itemId: 100 | 200; }[] | { itemId: 100 | 200; }[]; upperCode: "A" | "B"; lowerCode: "a" | "b"; }' is not assignable to type 'AorB'. Type '{ items: { itemId: 100 | 200; }[] | { itemId: 100 | 200; }[]; upperCode: "A" | "B"; lowerCode: "a" | "b"; }' is not assignable to type 'B'. Types of property 'upperCode' are incompatible. Type '"A" | "B"' is not assignable to type '"B"'. Type '"A"' is not assignable to type '"B"'.(2322)

ただし、下記のように「lowerCode」の型定義とmapで返すオブジェクトの「lowerCode」をコメントアウトしたら型エラーがなくなりました!!

type A = { items: { itemId: 100 | 200; }[]; upperCode: 'A'; // lowerCode: 'a'; コメントアウトしました。 }; type B = { items: { itemId: 100 | 200; }[]; upperCode: 'B'; // lowerCode: 'b'; コメントアウトしました。 }; type AorB = (A | B) const func = ( raws: AorB[], code: string ) => { // 型エラーが起きない!! const ret: AorB[] = raws.map( raw => { if (raw.upperCode === code) { return { items: raw.items, upperCode: raw.upperCode, // lowerCode: raw.lowerCode コメントアウトしました。 } } return raw; }) return ret }

エラーが起きた理由と起きなくなった理由が知りたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

mapの中でのrawA|B型ですので、そのままプロパティを取れば、raw.upperCode"A" | "B"型に、raw.lowerCode"a" | "b"型になります。

そして、このupperCodelowerCodeの関連性が消えてしまった型条件では、uppueCode: "A", lowerCode: "b"のような組み合わせが発生しうるようになってしまい、これはA|Bに入れられないためエラーとなります。

投稿2020/12/05 13:40

maisumakun

総合スコア145975

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

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

TuTettuuu

2020/12/06 03:10

なるほど、uppueCode: "A", lowerCode: "b" みたいな組み合わせの可能性がたしかに含まれてしまっていますね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問