gpt4 book ai didi

javascript - Record 和 {} 之间的区别?

转载 作者:行者123 更新时间:2023-11-28 12:51:37 25 4
gpt4 key购买 nike

我看到的唯一区别是您无法将其他属性添加到 {}但您可以Record<string, any> 。我还有什么遗漏的吗?

示例代码(playground link):

const one: Record<string, any> = { foo: 1 }
one.bar = 2

const two: {} = { foo: 1 }
two.bar = 2 // Property 'bar' does not exist on type '{}'.(2339)

最佳答案

好吧,真正的问题是为什么我们可以将任何对象分配给 {} 。这更多的是关于语言设计的选择。语言是建立在结构子类型兼容性之上的。

Type compatibility in TypeScript is based on structural subtyping. Structural typing is a way of relating types based solely on their members. This is in contrast with nominal typing.

这意味着我们可以为其子类型分配更宽松的类型值。在你的代码中{}是最宽的对象类型,我们可以说每个对象类型的父类型,换句话说,每个其他对象类型都是 {} 的子类型。以下是一些检查示例:

type ISubTypeOfEmptyObj<T> = T extends {} ? true : false
type Check1 = ISubTypeOfEmptyObj<{bar: 2}> // yes it is
type Check2 = ISubTypeOfEmptyObj<{foo: 2, bar: 'a'}> // yes it is
type Check3 = ISubTypeOfEmptyObj<number> // surprisingly that is also true
const a: {} = 1; // no error 😱

它证明了什么 - 您可以创建 {} 的实例几乎凭空而来(只有 nullundefined 值不能是 {} 的成员)。但在初始化之后,您不能只将某些属性设置为这样的值,因为类型表示没有。换句话说,你可以制作 {}几乎任何东西,但你只能像空对象一样使用它。

Record<string, any>是比 {} 更严格的类型,例如每个数组类型都可以分配给 {} ,并且不能分配给 Record<string, any> ,这同样适用于其他类型,例如 stringnumberRecord<string, any>表示具有任何字符串属性的所有对象,因此您可以将任何字符串属性附加到该对象,因为类型将保留。

关于javascript - Record<string,any> 和 {} 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60996831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com