やりたいこと
ts
1type Hoge = { foo: string, bar: number, baz: string[] } 2const value: string = 'foo'
上記の型定義と変数が存在する時、value
(string型変数)の内容がHoge
のkeyに存在するかを確認したいです。
もう少し具体的にやりたいことを書くと、上記の場合foo
はHoge
のkeyに存在するのでtrue
になり、もしvalue
の内容がfuga
(Hoge
のkeyに存在しない文字列)だった場合はflase
になるような条件分岐を書きたいです。
よろしくお願いします。
追記
上記内容ができないようであれば、何らかの形でkeyの列挙を1箇所にまとめたいです。
もう少し具体定期なコードに落とし込むと
ts
1const userPropertys = ['id', 'name'] 2type User = { id: string; name: string } 3 4const value = 'name' 5if (userPropertys.includes(value)) { 6 console.log('true') 7}
上記のように値で持つことでチェックすることができることは理解しているのですが、例えばここにphone: number
プロパティが追加になった場合にuserPropertys
とUser
型の2箇所に追加しなければならないことに憤りを感じています。
せめてUser
型はuserPropertys
の値全てをkeyに持たないとコンパイルエラーとなるとか、userPropertys
に列挙された値のみkeyに持てるとか、両者の繋がりを作ることでそういった安全性が欲しいのですが、何か解決手段は無いでしょうか。
追記2
なぜこのようなことをしたいのかについて触れておくと、以下のようなユーザー定義型ガードを実装する上で使用したいからです。
ts
1const userPropertys = ['id', 'name', 'phone'] 2type User = { id: string; name: string; phone: number } 3 4const Func = (value: unknown): value is keyof User => { 5 return typeof value === 'string' && userPropertys.includes(value) 6}
追記3
ts
1const stringKeys = ['name', 'address'] as const 2const numberKeys = ['phone'] as const 3 4// 配列の型から値の型を抽出 5type ArrayElement<ArrayType extends readonly unknown[]> = ArrayType[number] 6 7type UserString = { 8 [k in ArrayElement<typeof stringKeys>]: string 9} 10type UserNumber = { 11 [k in ArrayElement<typeof numberKeys>]: number 12} 13 14type User = UserString & UserNumber 15 16const user: User = { 17 name: 'hoge', 18 address: 'hoge', 19 phone: 111, 20} 21
回答2件
あなたの回答
tips
プレビュー