为什么显式布尔检查会更改类型防护的行为

时间:2019-04-02 21:02:21

标签: typescript

为什么item instanceof TypeB === true的行为不同于item instanceof TypeB,而isTypeB(item) === true的行为却不同于isTypeB(item),其中isTypeB(item): item is TypeB;的行为?

const items: (TypeA | TypeB)[] = [];

items.forEach(item => {

  // instanceof explicit
  if (item instanceof TypeB === true) {
    // mouse over item -> TypeA | TypeB
    doWithB(item); // red squiggly
  }

  // instanceof implicit
  if (item instanceof TypeB) {
    // mouse over item -> TypeB
    doWithB(item);
  }

  // Type predicates explicit
  if (isTypeB(item) === true) {
    // mouse over item -> TypeA | TypeB
    doWithB(item); // red squiggly
  }

  // Type predicates implicit
  if (isTypeB(item)) {
    // mouse over item -> TypeB
    doWithB(item);
  }

});

这应该是相同的逻辑和开发人员偏好。这是打字稿错误吗?

https://stackblitz.com/edit/typescript-type-predicates-scope-with-explicit-bool?file=index.ts

1 个答案:

答案 0 :(得分:2)

  

为什么TypeB的instance instance === true与TypeB的instanceInstance表现不同

仅因为一个是有效的类型保护,而=== true不是有效的类型保护。 TypeScript不会尝试变得聪明,因为您可以总是将其破坏,例如这是一个返回true但内部改变状态的函数:

  const assign = (): true => {
    item = new TypeA();
    return true;
  }

  // instanceof explicit
  if ((item instanceof TypeB) === assign()) {
    // mouse over item -> TypeA | TypeB 
    doWithB(item); // Aren't you glad its an error
  }

isTypeB(item) === true相同。

有关报告的更多信息

TypeScript可以使其有效,但是isTypeB(item)本身已经可以工作,并且您想要工作的人为设计的示例在没有理由说明为什么需要编写这样的代码的情况下也不会成为错误。