社会人の時に使用する型と、学生の時に使用する型があったとします。

interface Profile {
  name: string
  age: number
}

interface Worker extends Profile {
  job: string
}

interface Student extends Profile {
  school: string
}

この型を社会人の時と学生の時で使い分ける時、どうすればいいのでしょうか。

このような時に使用するのが、コンディショナルタイプ(Conditional Types)です。

書き方は、以下のように三項演算子で書きます。

type Resume<T> = T extends { job: string } ? T : Student

TWorkere の時は、jobがあるのでWorkerになり、TStudentの時は、jobがないのでStudentになります。

TWorkerにしてみます。

const profile: Resume<Worker> = {
  name: "田中",
  age: 23,
  job: "営業",
}

確認してみると、

image2

エラーが発生しておりません。

では、T を Student にしてみます。

const profile: Resume<Student> = {
  name: "田中",
  age: 23,
  job: "営業",
}

確認してみると、

image3

エラーとなり、『型 '{ name: string; age: number; job: string; }' を型 'Student' に割り当てることはできません。オブジェクト リテラルは既知のプロパティのみ指定できます。'job' は型 'Student' に存在しません。』と指摘されました。

ブログ一覧