Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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
Typescript 为什么这个对象是';s类型解析为类型联合的一侧?_Typescript - Fatal编程技术网

Typescript 为什么这个对象是';s类型解析为类型联合的一侧?

Typescript 为什么这个对象是';s类型解析为类型联合的一侧?,typescript,Typescript,看这个 为什么第18行的obj已解析为Foo,这导致第19行的类型为从不?似乎在代码中的这一点上,它仍然应该是Foo | Bar,因为Math.random()只能在运行时知道,TS无法决定类型 所以我认为TS根本不考虑Bar类型。这就是为什么您从未使用过 此外,TS在使用扩展运算符时表现不佳 但我还不确定:) 我的评论是错误的。TS中的TS运算符的行为类似于typeguard,但由于TS 3.8.3,它不再是typeguard: //TS 3.7.5 接口Foo{ 酒吧:字符串; } 类型栏=

看这个

为什么第18行的
obj
已解析为
Foo
,这导致第19行的类型为
从不
?似乎在代码中的这一点上,它仍然应该是
Foo | Bar

,因为
Math.random()
只能在运行时知道,TS无法决定类型

所以我认为TS根本不考虑
Bar
类型。这就是为什么您从未使用过

此外,TS在使用
扩展运算符时表现不佳

但我还不确定:)

我的评论是错误的。TS
中的TS
运算符的行为类似于typeguard,但由于TS 3.8.3,它不再是typeguard:

//TS 3.7.5
接口Foo{
酒吧:字符串;
}
类型栏=Foo&{
baz:字符串;
}
constproduceboolean=()=>Math.random()>0.5;
常量对象:Foo | Bar={
酒吧:“baz”,
…(produceBoolean()&&{
巴兹:“酒吧”
})
}
if(obj中的“baz”){
console.log(obj)//Bar
}
if(obj中的“条形”){
console.log(obj)//Foo | Bar
}

//TS 3.8.3
接口Foo{
酒吧:字符串;
}
类型栏=Foo&{
baz:字符串;
}
constproduceboolean=()=>Math.random()>0.5;
常量对象:Foo | Bar={
酒吧:“baz”,
…(produceBoolean()&&{
巴兹:“酒吧”
})
}
if(obj中的“baz”){
console.log(obj)//从不
}
if(obj中的“条形”){
console.log(obj)//Foo
}

我不明白他们为什么做出这样的决定

此外,如果删除显式键入:

接口Foo{
酒吧:字符串;
}
类型栏=Foo&{
baz:字符串;
}
constproduceboolean=()=>Math.random()>0.5;
常量对象={
酒吧:“baz”,
…(produceBoolean()&&{
巴兹:“酒吧”
})
}
if(obj中的“baz”){
console.log(obj)//baz仍然是可选的
}
baz
属性仍然是可选的

我认为原因与
Object.keys()
总是返回
string[]
,而不是预期的
keyof T
——这是因为可变性


请随意批评我

您的类型
Bar
被定义为
Foo
的一个子类型,因此联合
Foo | Bar
实际上与
Foo
是等价的。打个比方,如果你家外面有一棵树或一棵橡树,那么更简单地说,我们可以说有一棵树。

在看到这种行为与几年前的Typescript版本(3.7.5)有所不同,并认为这似乎是一个bug之后,我在他们的问题跟踪器上打开了一个问题:


他们刚刚将其标记为bug,所以现在我想我会将其标记为回答,答案是“它没有按预期工作。”

这是因为
中的
是一个打字机。请看这个问题,我知道
中的
是一个typeguard,但它正在解析为完全错误的类型。具体地说,obj
中的
“baz”应该使它成为type
Bar
,但在完成类型检查之前它就变成type
Foo
。然后在条件下,它被键入为
从不
。我不太相信
数学.random
,它将生成的值在运行时之前是未知的,但编译器可以确信该函数将始终以任何方式生成布尔值。这意味着它应该能够知道它可以是一个或另一个。代码的后面部分。但是,早期Typescript版本中的行为差异是一个有趣的问题。我写我的答案不是因为我假装它完全正确,只是想展示早期版本之间的差异。我会努力深入挖掘)别误会我,我感谢你的努力@CoryHarper:谢谢,不用担心)你能解释一下为什么Typescript 3.7.5中的这种行为与我设置的游乐场版本有所不同吗?你可以在同一个链接上进行测试,如果有时间的话可以修改版本。我不知道是什么改变了Typescript,但是在最近的版本中,
never
显然是不正确的;我看你已经在问题追踪者上报告了,这似乎是正确的选择。