📒

Typescriptの型の備忘録

2021/11/22に公開

目的

typescriptの型で、すぐ忘れてしまう型や理解しにくい型などは、個人的にググるはめになることが多いため、自分の理解を備忘録としてまとめておく。

keyof

機能

keyof T
  • Tのプロパティ名のユニオン型を生成

type Ab = {a:string, b:string}
type KeyofAb = keyof Ab // 'a' | 'b' の型が生成される

in (mapped type の定義)

機能

{[P in {ユニオン型}]: T}
  • [P in {ユニオン型}]で、{ユニオン型}をプロパティ名として取り出して、それぞれのプロパティにT型をつけて定義する
  • {ユニオン型}は、stringにアサイン可能である必要がある。
  • in は ユニオン型よりPにプロパティを取り出すぐらいのイメージ。

例1

type MappedAb = {[P in 'a' | 'b']:number} 
// 以下、結果
// type MappedAb =  {
//    a: number;
//    b: number;
// }

例2

type Ab = {a:string, b:string}
type MappedAb = {[P in Ab]:number} 
// 以下、結果
// type MappedAb =  {
//    a: number;
//    b: number;
// }

infer

機能

T extends { expected: infer U } ? U : never;
  • T extends { expected: infer U }の部分では、 infer UTが継承可能であるexpectedプロパティの型Uを推論する。
  • 全体では、上記の推論で、型が見つかれば推論されたU型、なければnever型になる

type IdString = {id: string}
type IdNumber = {id: number}

// `infer U`が、idにアサイン可能な型Uを推論する
type Id<T> = T extends {id: infer U} ? U : never
const idStr: Id<IdString> = '1' // string型が推論される
const idNum: Id<IdNumber> = 1 // number型が推論される

Discussion