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

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

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

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

Q&A

解決済

2回答

335閲覧

TypeSrcipt:Objectから、そのメンバを許容するユニオン型を作成したい

UnripeTomato

総合スコア25

TypeScript

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

0グッド

0クリップ

投稿2021/07/01 15:32

前提・実現したいこと

TypeSrciptのObject(または定数)があるとします。
そのObjectの子のObjectのユニオン型のtypeを作成する方法をご教示いただきたく。

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

const またはある一定の定数を持つ変数を作成し
そのメンバーのユニオン型を作成したいのですが、どうやって作成すればいいのか、発想が思い浮かばずにおります。

該当のソースコード

TypeScript

1const ITEMS = { 2 a: { id: 1, value: "1111" }, 3 b: { id: 2, value: "2222" }, 4} as const 5 6type myType = { [P in keyof typeof ITEMS]: typeof ITEMS[P] } 7 8const f = (item:myType) => { 9 console.log(item); 10 // a: { id: 1, value: "1111" } 11 // or 12 // b: { id: 2, value: "2222" } 13} 14 15f(ITEMS.a) //こういう呼び出し方をしたい。 16/* 17型 '{ readonly id: 1; readonly value: "1111"; }' の引数を型 'myType' のパラメーターに割り当てることはできません。 18 型 '{ readonly id: 1; readonly value: "1111"; }' には 型 'myType' からの次のプロパティがありません: a, bts(2345) 19const ITEMS: { 20 readonly a: { 21 readonly id: 1; 22 readonly value: "1111"; 23 }; 24 readonly b: { 25 readonly id: 2; 26 readonly value: "2222"; 27 }; 28} 29*/

試したこと

定数にしてみたり、Typeにしてみたり、右往左往・・・

TypeScript

1 2const itemsType = { 3 a: { id: 1, value: "1111" }, 4 b: { id: 2, value: "2222" }, 5} as const 6 7type myType = { [P in keyof typeof itemsType]: typeof itemsType[P] } 8/* 9type myType = { 10 readonly a: { 11 readonly id: 1; 12 readonly value: "1111"; 13 }; 14 readonly b: { 15 readonly id: 2; 16 readonly value: "2222"; 17 }; 18} 19*/

補足情報

const 部分はどういった宣言でもいいのですが、そもそも、
こういった型から、

TypeScript

1const ITEMS = { 2 a: { one:string, two:string }, 3 b: { one:string, two:string }, 4} // as const

このようなユニオン型を作れるのかどうか、あれはその記述方法をご教示いただけますと幸いです。

TypeScript

1const expect = {a: { one:string, two:string }} | {b: { one:string, two:string }}

不足情報があれば、ご指摘いただけますと幸いです。
お手数をおかけいたしますが、よろしくお願い申し上げます。

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

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

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

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

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

guest

回答2

0

もっと凝れそうですが、サラッとやるならこんな感じでしょうか。

TypeScript

1type Entity = { type: 'a' | 'b', 'id': number, 'value': string } 2type Rec = { 'a': Entity, 'b': Entity } 3const ITEMS: Rec = { 4 'a': {type: 'a', 'id': 1, 'value': 'aaa'}, 5 'b': {type: 'b', 'id': 2, 'value': 'bbb'} 6} 7 8const f = (item:Entity) => { 9 console.log(item); 10} 11 12f(ITEMS.a)

TypeScript: TS Playground - An online editor for exploring TypeScript and JavaScript

投稿2021/07/01 16:48

編集2021/07/01 16:49
A_kirisaki

総合スコア2853

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

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

UnripeTomato

2021/07/02 01:38

回答いただき、ありがとうございます!! 説明不足で申し訳ございません。 今回の例でいうと、const ITEMS のキーの中の型は常に一定ではないものを想定しておりました。 ですが、頂いたコードを元に、なるほど、typeを分けて考えていけばいいのかとヒントをいただき、試行錯誤した結果、解答にたどり着くことができました。 そのコードを以下に投稿いたします。
UnripeTomato

2021/07/02 01:42 編集

type itemType = typeof ITEMS[keyof typeof ITEMS]
guest

0

自己解決

TypeScript

1//何らかの定数があるとする。 2const ITEMS = { 3 ITEM_A: {one: 1, two: 2,}, 4 ITEM_B: {one: 1, two: 2, three:3}, 5 ITEM_C: {one: 1, two: 2, three:3, four:4}, 6} 7 8//定数の中の型のユニオン型を定義 9type itemType = typeof ITEMS[keyof typeof ITEMS] 10 11const f = (item:itemType) => { 12 console.log(item); 13} 14f(ITEMS.ITEM_A) 15f(ITEMS.ITEM_B) 16f(ITEMS.ITEM_C) 17// { one: 1, two: 2 } 18// { one: 1, two: 2, three: 3 } 19// { one: 1, two: 2, three: 3, four: 4 }

//上記のジェネリック版

TypeScript

1type valueOf<T> = T[keyof T]; 2type itemTypeGeneric = valueOf<typeof ITEMS> 3const f2 = (item:itemTypeGeneric) => { 4 console.log(item); 5} 6console.log('type generic'); 7f(ITEMS.ITEM_A) 8f(ITEMS.ITEM_B) 9f(ITEMS.ITEM_C) 10// { one: 1, two: 2 } 11// { one: 1, two: 2, three: 3 } 12// { one: 1, two: 2, three: 3, four: 4 }

投稿2021/07/02 01:42

UnripeTomato

総合スコア25

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問