交差(インターセクション)型
複数の型を&
でまとめたもの。
例)
typescript
type Type1 = {
name: string
age: number
}
type Type2 = {
age: number
hobby: string
}
type Type3 = Type1 & Type2 // `Type1`と`Type2`を `&` でまとめる。
const testObj:Type3 = {
name: "test",
age: 32,
hobby: "basketball"
}
上記の例で、Type1
ではname
とage
のプロパティがあり、Type2
ではage
とhobby
のプロパティがある。
共通で持っているプロパティはage
のみ。
この二つを'&'でまとめたType3
の型は以下の通りになる。
typescript
type Type3 = {
name: string
age: number
hobby: string
}
なお、共通のプロパティがあるが型が異なる場合はどうなるか。
typescript
type Type1 = {
name: string
age: number
}
type Type2 = {
name: string
age: string
hobby: string
}
type Type3 = Type1 & Type2
const testObj:Type3 = {
name: "test",
age: 32, // 絶対あり得ない型になるため`naver`エラーになる。
hobby: "basketball"
}
では、共通するプロパティの片方の型がユニオン型だとどうなるだろう。
正解は、共通する方のみが採用される。
typescript
type Type1 = {
name: string
age: number
}
type Type2 = {
name: string
age: number | string
hobby: string
}
type Type3 = Type1 & Type2
const testObj:Type3 = {
name: "test",
age: 32,
hobby: "basketball"
}
上記の例だと、Type3
のage
の型はnumber
のみに共有しているので、number
のみになる。
共用体型(ユニオン)型
複数の型を|
で区切ってor
を表現したもの。
typescript
type Type1 = {
name: string
age: number
}
type Type2 = {
age: number
hobby: string
}
type Type3 = Type1 | Type2 // `|`で区切って`or`を表現
const testObj:Type3 = {
age: 32,
hobby: "basketball"
}
ここでType3
の型は、Type1
もしくはType2
になる。
よって、testObj
はType1
もしくはType2
の型に合致すれば、エラーは出ない。
逆にType1
にもType2
にも合致しなかった場合は、エラーになる。
例)
typescript
type Type1 = {
name: string
age: number
}
type Type2 = {
age: number
hobby: string
}
type Type3 = Type1 | Type2
const testObj:Type3 = { // `Type1`と`Type2`2は`age`のプロパティがあるが、`testObj`にはないためエラーになる
name: "test",
hobby: "basketball"
}