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

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

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

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

TypeScript

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

Q&A

1回答

554閲覧

あるリテラル型を取り除いた型を作りたい

eslint

総合スコア18

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

TypeScript

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

0グッド

2クリップ

投稿2021/04/29 21:51

前提・実現したいこと

TypeScriptであるリテラル型を取り除いた型を作りたいです。

現在、以下のようなオブジェクトのtypeプロパティに応じて出力を変えるプログラムを作成しています。
単純にstring型を設定したら、型が重複するようでエラーが出ました。

どのような型を作成すればエラーが解決できるでしょうか?
よろしくお願いいたします。

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

TS2339: Property 'hogehoge' does not exist on type '{ type: "hoge"; hogehoge: string; } | { type: string; else: {}; }'.   Property 'hogehoge' does not exist on type '{ type: string; else: {}; }'.

該当のソースコード

TypeScript

1type XXX = { 2 type: 'hoge', 3 hogehoge: string, 4} | { 5 type: 'fuga', 6 fuga: number, 7} | { 8 type: 'hoge''fuga'以外のstring, 9 else: {}, 10}; 11 12function test(x: XXX) { 13 switch(x.type) { 14 case 'hoge': 15 console.log(x.hogehoge); 16 break; 17 case 'fuga': 18 console.log(x.fuga); 19 break; 20 default: 21 console.log(x.else); 22 break; 23 } 24}

試したこと

Utility Typesというのも調べてみたのですが、Excludeはユニオン型以外には用いれないそうです。(参考サイト)

補足情報(FW/ツールのバージョンなど)

tsconfig.jsonです。

json

1{ 2 "compilerOptions": { 3 "target": "es2020", 4 "module": "es2020", 5 "strict": true, 6 "esModuleInterop": true, 7 "skipLibCheck": true, 8 "forceConsistentCasingInFileNames": true 9 } 10}

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

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

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

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

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

guest

回答1

0

こんなふうにオブジェクトで包んであげると可能になります。

JavaScript

1 type: 'hoge', 2 hogehoge: string, 3} | { 4 type: 'fuga', 5 fuga: number, 6} | { 7 type: {other: string}, 8 other: {}, 9}; 10 11function test(x: XXX) { 12 switch(x.type) { 13 case 'hoge': 14 console.log(x.hogehoge); 15 break; 16 case 'fuga': 17 console.log(x.fuga); 18 break; 19 default: 20 console.log(x.other); 21 break; 22 } 23} 24 25test({type: 'hoge', hogehoge: 'nyaan' }) 26test({type: 'fuga', fuga: 42}) 27test({type: {other: 'foo'}, other:{}})

https://www.typescriptlang.org/play?ssl=28&ssc=39&pln=1&pc=1#code/C4TwDgpgBAGnUF4oG8CwAoKpIC4oHIALAewHMJ8AaDKE8uiPAZ2ACcBLAO1OvQF8oAHxQ1sjAgDMArqQCGVGtLl5OUgLYAjCK14DhaTGLzJiwQtuZsupPryinzrY7Yx8A3BgzTOAY2DtiTiwIFgAKAA88OBgAShFMJgB3dmAfQgiAOjE4gygoH1kmaCIyChwaPJ9ApmIAGwgM2rJMhgYYj0w8jVYIWQBrDsrC4qV5cs786rqGptJM0faKqG7egYqAEwgJWSla4HG8yc4a+sbm8IyHbUWJlf7BvldPdGAQ4FDkIwIGKlpShjw+E4IFksk4+CgfBiGFeYU+4HE+FGv1GeAALAAmKEwt4fL4mMwWSTEYj4Wz2QlOZB8KFAA

投稿2021/04/30 00:45

A_kirisaki

総合スコア2853

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問