为什么typescript在使用逻辑运算符时将联合类型解析为可能的空字符串?

为什么typescript在使用逻辑运算符时将联合类型解析为可能的空字符串?,typescript,logical-operators,union-types,Typescript,Logical Operators,Union Types,我试图使用逻辑运算符来防止空对象。可能为null的对象包含字符串和联合类型作为属性。如果使用“&&”运算符检查对象是否为null,则整个表达式将被计算为另一个联合类型,该类型允许空字符串,并且存在类型不匹配错误 我已经验证了,如果我没有使用逻辑运算符,而是使用if语句,代码工作正常,但我想了解为什么它没有按照我的预期得到解决 type FooType='aaa'|'bbb'|'ccc'; ​ 接口IFoo{ 类型:足型; id:字符串; } ​ 类型fooalis=IFoo; ​ const f

我试图使用逻辑运算符来防止空对象。可能为null的对象包含字符串和联合类型作为属性。如果使用“&&”运算符检查对象是否为null,则整个表达式将被计算为另一个联合类型,该类型允许空字符串,并且存在类型不匹配错误

我已经验证了,如果我没有使用逻辑运算符,而是使用if语句,代码工作正常,但我想了解为什么它没有按照我的预期得到解决

type FooType='aaa'|'bbb'|'ccc';
​
接口IFoo{
类型:足型;
id:字符串;
}
​
类型fooalis=IFoo;
​
const fooObject={type:'aaa',id:'111'}作为IFoo;
​
常量fooObject2:FooAlias={
id:fooObject&&fooObject.id,
类型:fooObject&&fooObject.type
/*上面这一行抱怨:
类型““|”aaa“|”bbb“|”ccc”不可分配给类型“FooType”。
类型“”不可分配给类型“FooType”。ts(2322)*/
};
如果使用
type:foooobject和&foooobject.type代替
type:foooobject?fooObject.type:null
它可以工作,因为它似乎没有正确地假设它可能是空字符串。

这是一个报告。如果
stricknullchecks
关闭,则会有一个额外的
潜入

在解决此问题之前,您可以使用类型断言或三元运算符:

const fooObject2: FooAlias = {
  id: fooObject && fooObject.id,
  //type: (fooObject && fooObject.type) as FooType
  type: fooObject ? fooObject.type : undefined
};