const soleil = ['星宮いちご', '霧矢あおい', '紫吹蘭']
みたいな配列から '星宮いちご' | '霧矢あおい' | '紫吹蘭'
という配列の値の Union 型が作りたい。
typeof list[number]
で配列の値の Union 型が作れる!
const soleil = ['星宮いちご', '霧矢あおい', '紫吹蘭'] as const; type MemberOfSoleil = typeof soleil[number]; // => type MemberOfSoleil = '星宮いちご' | '霧矢あおい' | '紫吹蘭'
できた ₍ ᐢ. ̫ .ᐢ ₎👌
typeof soleil
が readonly ["星宮いちご", "霧矢あおい", "紫吹蘭"]
という型になるので、配列の index は number なので typeof soleil[number]
で配列の各要素を取り出してきた型という解釈になるっぽい。(厳密には分かってない。ゆるふわ解釈)
Object で定義する方が可読性は良いかも
ただ typeof Array[number]
って表記は若干なんの型ができてるのか解りにくい気もするので、元を配列ではなくオブジェクトにしてしまってオブジェクトの値を取り出す形にした方が見やすいかも。変数を使用する箇所は Object.values()
すれば配列として扱えるし。
オブジェクトで定義した版
const soleil = { ichigo: '星宮いちご', aoi: '霧矢あおい', ran: '紫吹蘭', } as const; type MemberOfSoleil = typeof soleil[keyof typeof soleil]; // => type MemberOfSoleil = '星宮いちご' | '霧矢あおい' | '紫吹蘭'
おわり。
[参考]
- 判別可能なUnion型 - TypeScript Deep Dive 日本語版
- TypeScript: Handbook - Unions and Intersection Types
- Typescript derive union type from tuple/array values - Stack Overflow