はじめに
例えば、for (const key in obj)
内でのkey
の型などについて理解できていなかったのでまとめる。
結論
上記の例で言うと、key
の型は「Extract<keyof T, string>
」で、
obj
のkeyの文字列リテラルのユニオン型(String Literal Union)
でかつ、string型のもの。という意味になる。
詳細
Extract
とは
Extract<T,U>
:T型のプロパティでU型に代入可能なプロパティのみを残した型を構築する。
keyof
とは
keyof T
:以下のようにオブジェクトのプロパティ名を抽出して 文字列リテラルのユニオン型(String Literal Union)
を取得できる。
type Person = {
name: string;
old: number;
};
type Keys = keyof Person; // "name" | "old"
これがわかれば、以下のようなメソッドがあった場合にkey
に入り得るのは、”name”か”old”だけ、と理解できる。
function shallowCopy<T extends object>(obj: T): T {
const result = {};
for (const key in obj) {
result[key] = obj[key];
}
return result;
}
const testObj = {
name: "yamada",
old: 15
}
shallowCopy<Person>(testObj)
おわりに
Extract
などが絡んできて複雑そうに感じたが一つ一つ理解すれば、なにも問題なかった。
Extract<keyof T, string>
という見た目が難しそうなだけで、内容は「for (const key in obj)
とした場合のkey
はオブジェクトのkey
一覧の中のどれか」という当たり前のことであった。