🗂
TypeScript の Pick・Exclude・Omit
概要
TypeScript の Utility Types を読むだけでは理解できないのがあったので触ってみた。
この記事では、Pick と Exclude、Omit の3つを触る。
TL;DR
Omit は、Pick と Exclude を使って表現できる。
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
Pick<T, K> とは?
T 型から K で選択したプロパティのみを取り出した新しい型を作る。
下記の例だと、T = User, K = 'id' | 'name' となる。
// interface でも可
type User = {
id: number
name: string
age: number
birthday: string
}
type PickedUser = Pick<User, 'id' | 'name'> // { id: number, name: string }
Exclude<T, U> とは?
T 型と U 型で共通するプロパティを T 型のプロパティから除いた新しい型を作る。
プロパティの型は関係なく、プロパティ名が同じなら除外される。
下記の例だと、T = User, U = AuthUser となる。
type User = {
id: number
name: string
age: number
birthday: string
}
type AuthUser = {
id: number
name: string
role: string
}
type AgeOrBirthday = Exclude<keyof User, keyof AuthUser> // age | birthday
Omit<T, K> とは?
T 型から K で選択したプロパティのみを除いた新しい型を作る。
下記の例だと、T = User, K = 'birthday' となる。
type User = {
id: number
name: string
age: number
birthday: string
}
type OmittedUser = Omit<User, 'birthday'>
const printUserInfo = (user: OmittedUser) => {
console.log(`${user.id}: ${user.name}(${user.age})`)
}
Omit は上で紹介した Pick と Exclude を使うことで表現できる。
type MyOmit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
T = User, K = 'birthday' と置いて、見ていく。
type User = {
id: number
name: string
age: number
birthday: string
}
type A1 = Exclude<keyof User, 'birthday'> // 'id' | 'name' | 'age'
type A2 = Pick<User, A1> // { id: number, name: string, age: number }
Discussion