はじめに
例えば、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一覧の中のどれか」という当たり前のことであった。