はじめに
オブジェクトの仕様については、TypeScriptというよりはJavascriptだが、把握できていなかったことがあったのでまとめておく。
結論
function shallowCopy<T extends object>(obj: T): T {
const result = {} as T;
for (const key in obj) {
result[key] = obj[key];
// console.log(obj);
}
return result;
}
などのように、引数にオブジェクトを受け取る関数の場合など、オブジェクトの型が未確定の場合は、
for (const key in obj)
の key
はデフォルトでconst key: Extract<keyof T, string>
という型がつくようになっている。
これには、obj[key]
などとプロパティにアクセスする際にkeyに対してtoString
が自動的に実行されていることが関係している。
詳細
もし、
type TestObj ={
1: string
2: string
}
const obj2 = {
1: "taro",
2: "yamada",
}
const copyObj = shallowCopy<TestObj>(obj2);
というような形で、Tの型がnumberであっても
for (const key in obj) {
result[key] = obj[key];
}
result[key]
が実行されるタイミングで、keyがtoStringされるので、
(JavaScriptのランタイムは.toStringを事前に呼び出す)
const key: Extract<keyof T, string>
には反さないので問題ない。
おわりに
オブジェクトのkeyの型が定まっていないのに何故Extract<keyof T, string>
とstringに限定するか、など把握しきれていなかった部分を理解することができました。