打字稿:对于 (let key in obj),`key` 是 `Extract<keyof T, string>` 而不仅仅是 `keyof T`,为什么?

Typescript: for (let key in obj), `key` is `Extract<keyof T, string>` instead of just `keyof T`, why?

我想 iterate 覆盖 object,当我使用 for-in 时,我注意到一件非常奇怪的事情:

function forIn<T extends object>(obj: T): void {
  for (let key in obj) {
    // key's type is `Extract<keyof T, string>` instead of just `keyof T`
  }
}

我的VSCode截图:

这引出了两个问题:

  1. 为什么 key 的类型是 Extract<keyof T, string> 而不是 keyof T
  2. 对象的key总是字符串类型,所以Extract<keyof T, string>什么都不做,对吧?

TypeScript 2.9 扩展了键类型以包括数字和符号类型。