Javascript 记录之间的差异<;字符串,任意>;还有{}?
我看到的唯一区别是,您不能向Javascript 记录之间的差异<;字符串,任意>;还有{}?,javascript,typescript,types,Javascript,Typescript,Types,我看到的唯一区别是,您不能向{}添加其他属性,但可以添加到记录。我还缺什么吗 示例代码(): const-one:Record={foo:1} 一巴=2 常数二:{}={foo:1} two.bar=2//类型“{}”上不存在属性“bar”。(2339) 类型{}仅与空对象匹配 记录类似于{[key:string]:any} 更新: 我的第一句话是错误的。类型{}与公认答案中所述的内容非常匹配好吧,所以真正的问题是为什么我们可以将任何对象分配到{}中。这更多的是关于语言设计的选择。语言是建立在结
{}
添加其他属性,但可以添加到记录
。我还缺什么吗
示例代码():
const-one:Record={foo:1}
一巴=2
常数二:{}={foo:1}
two.bar=2//类型“{}”上不存在属性“bar”。(2339)
类型{}
仅与空对象匹配
记录
类似于{[key:string]:any}
更新:
我的第一句话是错误的。类型
{}
与公认答案中所述的内容非常匹配好吧,所以真正的问题是为什么我们可以将任何对象分配到{}
中。这更多的是关于语言设计的选择。语言是建立在结构子类型兼容性之上的
TypeScript中的类型兼容性基于结构子类型。结构类型是一种仅基于其成员关联类型的方法。这与标称类型形成对比
这意味着我们可以为其子类型分配更松散的类型值。在您的代码中,{}
是最广泛的对象类型,我们可以说每种对象类型的父类型,换句话说,每种其他对象类型都是{}
的子类型。以下是一些示例检查:
type ISubTypeOfEmptyObj=T扩展{}?对:错
type Check1=ISubTypeOfEmptyObj//是
type Check2=ISubTypeOfEmptyObj//是
type Check3=ISubTypeOfEmptyObj//令人惊讶的是,这也是真的
常数a:{}=1;//没有错误那么为什么consttwo:{}={foo:1}
不抛出错误呢?不,第一部分是错误的{}
是最广泛的类型之一,而不仅仅是空对象文本类型。今天,{}
不再那么有用了,因为你最好能使用unknown
。那么为什么常量二:{}={foo:1}
不抛出一个错误呢?我希望我已经回答了你的问题。谢谢,你提供的额外示例让这更奇怪!是否有一个很好的用例可以用来输入{}
?我认为没有这种类型的用例。即使在TS的FAQ中,也有一些信息是你永远不需要的
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)