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

Why does typescript resolve a union type to possible empty string when using logic operators?

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

我已经验证,如果我不使用逻辑运算符,而是使用 IF 语句,代码工作正常,但我想了解为什么它没有像我预期的那样被解析。

type FooType = 'aaa' | 'bbb' | 'ccc';
​
interface IFoo {
  type: FooType;
  id: string;
}
​
type FooAlias = IFoo;
​
const fooObject = {type: 'aaa', id: '111'} as IFoo;
​
const fooObject2: FooAlias = {
  id: fooObject && fooObject.id,
  type: fooObject && fooObject.type
  /* The line above complains:
  Type '"" | "aaa" | "bbb" | "ccc"' is not assignable to type 'FooType'.
  Type '""' is not assignable to type 'FooType'.ts(2322)*/
};

if 而不是 type: fooObject && fooObject.type 我使用 type: fooObject? fooObject.type : null 它有效,因为它似乎正确地不假设它可能是一个空字符串。

这是一篇报道bug。如果 strictNullChecks 不在,额外的 "" 偷偷进来。

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

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

Play