自打字稿 2.4 以来,用户定义的类型保护发生了哪些变化



此代码适用于打字稿 2.3,但不适用于打字稿 2.4。你能解释一下为什么吗?

testFindTypeGuard.ts:

let el: Element;
const nodes: Node[] = [];
const result = nodes.find((n): n is HTMLFontElement => n.nodeName === "FONT");
el = result;

我的d.ts:

interface Array<T> {
    find<U extends T>(predicate: (value: T, index: number, obj: Array<T>) => value is U): U | undefined;
}

错误信息:

错误 TS2322:生成:"节点"类型不可分配给类型"元素"。

为了使您的示例按预期工作,您需要向编译器描述U。它没有进行自动扩大类型保护适用性的概念飞跃。

当您使用类型保护作为 if 语句的一部分时,它将为您更改类型(在 if 和 else 中)。但是在您的示例中,您需要传递 type 参数才能到达您想要的位置:

const result = nodes.find<HTMLFontElement>((n): n is HTMLFontElement => n.nodeName === "FONT");

编译器足够聪明,可以确定何时事情没有叠加,以下内容会给你一个错误:

const result = nodes.find<HTMLDivElement>((n): n is HTMLFontElement => n.nodeName === "FONT");

如果您认为编译器在以前的版本上做得更好,您可能需要在 GitHub 上提出问题......尽管您可能已经这样做了。

最新更新