为什么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
答案 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)
本身已经可以工作,并且您想要工作的人为设计的示例在没有理由说明为什么需要编写这样的代码的情况下也不会成为错误。