Typescript类型推断不适用于函数类型防护

时间:2020-09-23 14:19:28

标签: typescript

alpha中,我检查结果是否为null,如果是,则检查throw new Error,但编译器仍显示编译错误:

 const obj = {
  objMethod: function (): string | null {
    return 'always a string';
  },
};

function alpha() {
  if (obj.objMethod() === null) {
    throw new Error('type guard, but compiler does not count it as one :( ');
  }

  const beta: string = obj.objMethod();
  console.log(beta);
}

但是此代码可以很好地工作:

const obj = {
  objMethod: function (): string | null {
    return 'always a string';
  },
};

function alpha() {
  const result = obj.objMethod();
  if (result === null) {
    throw new Error('this DOES count as a type guard. ');
  }

  const beta: string = result; // no error
  console.log(beta);
}

1 个答案:

答案 0 :(得分:1)

Typescript无法证明您的objMethod将始终返回相同的值。它可能在第一次调用时返回非null值,而在第二次调用时返回null。如果将其分配给const变量,则检查将断言该变量不为null。由于该变量为const,因此赋值后该值不能更改,因此,如果它通过了检查,则该值必须为非空。