打字稿-内联未定义检查不起作用(对象可能是'undefined'.ts(2532))

时间:2019-05-03 11:58:17

标签: javascript typescript tsc

我收到以下打字稿错误:

_

以下作品:

const myFunction = (
  param1: string | undefined,
  param2: { someProp: string } | undefined
) => {
  if (!param1 && !param2) {
    return;
  }

  // Here I get the following Typescript error:
  //  (parameter) param2: { someProp: string } | undefined
  //  Object is possibly 'undefined'.ts(2532)
  const param3 = param1 ? param1 : param2.someProp;
};

但是重复检查两次null或undefined似乎是多余的。

我不得不提到,const param4 = param1 ? param1 : param2 ? param2.someProp : null; 选项在editorOptions中设置为strictNullChecks,并希望保持这种状态。

知道为什么会出现此错误吗?

这是一个代码为https://codesandbox.io/s/jn2mp01q2v

的CodeSandbox

2 个答案:

答案 0 :(得分:2)

关于TypeScript编译器的可悲事实是,它不像人类那样聪明(无论如何,从TypeScript 3.4开始),因此它的control flow analysis只是您可以进行的那种分析的淡淡阴影表现自己。当然,它的分析非常一致,而当我最近没有进食时,我的情况会变得更糟。

如果您对联合类型的变量执行检查以完全消除该联合的一个或多个组成部分,则编译器将很高兴为您缩小变量类型:

param1.charAt(0); // error, possibly undefined
if (!param1) return;
param1.charAt(0); // okay now

但是编译器不做的一件事是跟踪correlated variables之外的discriminated unions。通过检查

消除了什么
if (!param1 && !param2) return;

param1param2可以同时为undefined的可能性。您已经采用了两个先前独立的变量,并使它们彼此相关。编译器不跟踪的。由于param1param2仍然可以都是undefined(只是不同时),因此编译器将它们视为仍然独立,因此您会遇到问题。

您可以按照其他答案的建议进行操作,并使用type assertion,这意味着您比编译器更聪明,并且不想尝试带领编译器完成理解什么的任务您已经知道:

const param3 = param1 ? param1 : param2!.someProp; // I'm smarter than the compiler 

请注意,我使用了non-null assertion operator !,这可能是最简洁的方法来断言您对机器的优越性。还请注意,这样的主张并不安全,因为您可能会误认为自己的优势。因此,只有在您仔细检查三遍以确保param2不能成为undefined后,才能执行类似的操作。


您可以做的另一件事是重组代码,以便引导编译器完成 可以进行的分析。

const param3 = param1 || (param2 ? param2.someProp : undefined);
if (!param3) return;
param3.charAt(0); // string

这将为您工作,并且您只需检查每个参数一次。变量param3的类型为string | undefined,并且只有undefinedparam1都是虚假的时,变量param2才是。该代码中的每一步都完全消除了每个变量的并集构成,而不会留下任何相关的类型来混淆编译器。

任何一种解决方案都可以为您工作。希望能有所帮助;祝你好运!

答案 1 :(得分:0)

因为给param2提供了两种类型,一种是对象,另一种是未定义。 您必须给

const param3 = param1吗? param1:(param2任意).someProp;

然后它必须工作。