0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【TypeScript】オブジェクトの仕様と型について

Posted at

はじめに

オブジェクトの仕様については、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に限定するか、など把握しきれていなかった部分を理解することができました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?