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

问题描述

我正在尝试使用逻辑运算符来防范空对象。可能为 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它,因为它似乎正确地不假设它可能是一个空字符串。

标签: typescriptlogical-operatorsunion-types

解决方案


这是一个报告的错误。如果strictNullChecks没有额外的""潜入。

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

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


推荐阅读