在 Typescript 中,类型 `object` 和 `Record<any, any>` 之间有区别吗?

Beh*_*ath 7 typescript

这两种类型object,并Record<any, any>在我看来,包括相同的一组有效的对象,这是任何事情上typeof x === "object。两者之间有什么区别吗?

Fab*_*uer 7

object类型是为了抽象掉的对象的任何键,而Record<K, T>存在于专门定义的类型的键。这意味着在尝试访问对象属性时有所不同

Record<any, any>即使特定键未知,TypeScript 也将允许访问类型对象的任何属性,因为第一个泛型参数是any.

let a: Record<any, any>;
a.foo; // works
Run Code Online (Sandbox Code Playgroud)

object然而,在一个类型的对象上,键被假定为any。与 一样Record<any, ...>,TypeScript 不知道实际存在哪些键,但它不允许访问任何键:

let b: object;
a.foo; // error: Property "foo" does not exist on type "object"
Run Code Online (Sandbox Code Playgroud)

TypeScript playground 中尝试一下。

  • `Record` 被声明为 `type Record&lt;K extends string | 数量 | 符号,T&gt; = { [P in K]: T; }`,所以 `Record&lt;A, B&gt;` 等价于 `{ [key: A]: B; }` (7认同)
  • 那么我为什么要使用`object`,如果这有效地阻止了我访问任何属性? (2认同)