【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]>
}