【TypeScript】Mapped Type と Conditional Type を応用してプロパティの型と型名を相互変換する
Mapped Type と Conditional Type を応用して、オブジェクトのプロパティ型と型名を相互に変換できる。プロパティが string 型ならば "string" という文字列にしたり、逆にプロパティが"string"という文字列ならstring型にしたりできる。サンプルコードを見るのが早いので、問題と答え形式で以下に書いた。
問題(1)
次のような型 TypeNames<T>
を定義せよ。
// このような型があるとして、 type User = { name: string age: number active: boolean } // 以下の 2 つの型が同じになる type UserTypeNames = TypeNames<User> type UserTypeNames2 = { name: 'string' age: 'number' active: 'boolean' }
答え。
type TypeName<T> = T extends string ? 'string' : T extends number ? 'number' : T extends boolean ? 'boolean' : 'other' type TypeNames<T> = { [P in keyof T]: TypeName<T[P]> }
問題(2)
次のような型 ActualTypes<T>
を定義せよ。
// このような型があるとして、 type UserTypeNames = { name: 'string' age: 'number' active: 'boolean' } // 次の 2 つの型が同じになる type User = ActualTypes<UserTypeNames> type User2 = { name: string age: number active: boolean }
答え
type ActualType<T> = T extends 'string' ? string : T extends 'number' ? number : T extends 'boolean' ? boolean : unknown type ActualTypes<T> = { [P in keyof T]: ActualType<T[P]> }