1 回答

TA贡献1818条经验 获得超3个赞
我有两个建议。两者都不是完全类型安全的,但缺乏安全性包含在易于测试和手动验证的小函数中。两者都有这样的风险,如果你传入一个不相关的对象,node.ownerDocument.defaultView.Element你会得到不正确的结果,但这似乎是一个很小的风险。我没有在运行时测试过这些,但是任何需要的调整都应该是相对较小的。
declare class Element {};
function asElement(node: any): ?Element {
const OwnElement = node?.ownerDocument?.defaultView?.Element;
if (OwnElement != null && node instanceof OwnElement) {
return node;
} else {
return null;
}
}
function doThingWithElement(whatever: mixed): void {
const element = asElement(whatever);
if (element != null) {
(element: Element);
// Expected error
(element: string);
}
}
在这个例子中,asElement是一个函数,它在考虑 iframe 问题的情况下执行 instanceof 检查,并且当且仅当它通过检查时才返回参数。然后,您可以使用普通的空值检查进行细化。
declare class Element {};
declare function isElement(node: any): boolean %checks (node instanceof Element);
function isElement(node) {
const OwnElement = node?.ownerDocument?.defaultView?.Element;
return OwnElement != null && node instanceof OwnElement;
}
function doThingWithElement(whatever: mixed): void {
if (isElement(whatever)) {
(whatever: Element);
// Expected error
(whatever: string);
}
}
这将创建一个isElement函数,您可以直接使用它来执行细化。
顺便说一句,Element如果类的实例是Element类型,而不是类本身。Class<Element>是类本身的类型,但在右侧具有动态创建的类的情况下,Flow 似乎不执行类型改进。
添加回答
举报