📒
Typescriptの型の備忘録
目的
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 U
がT
が継承可能である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