Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 记录之间的差异<;字符串,任意>;还有{}?_Javascript_Typescript_Types - Fatal编程技术网

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)