我想知道如何避免这些无效的空检查,或者至少明白这一点是什么,因为它似乎适得其反。
如果省略空检查,Flowtype给我一个错误:
var myEl = new MyElement()
if (document.body != null) { // error on next line if omitted
document.body.appendChild(myEl)
}
我必须在每个回调中对文档正文执行null检查,因为谁知道,也许正文在这里是空的?! 我认为这是完全矫枉过正的。不仅如此,还有这么简单的零检查有什么意义呢?它只是默默地跳过程序的一个重要部分,并在其他地方展示未定义的行为,并使调试应用程序更加困难。 如果在这里发生错误,我真的更喜欢只有一个null异常,因为要确定我在javascript中编写的这个小的2行代码段必须在flowtype中这样:
var myEl = new MyElement()
if (document.body != null) {
document.body.appendChild(myEl)
} else {
console.error("null error")
}
所以4个额外的代码行和一些嵌套只是为了追踪我免费得到的东西,如果我让应用程序遇到错误。我在每个querySelector上都需要这4行。在每一个文件上。在每个getElementByTagName上。仅这一点可能会使我的整个代码库增加10%。 如此严格地执行这一点有什么意义?
在其他语言中,我也可以根据需要逐渐尝试捕捉这些热点,流量也不允许我这样做。无论是否添加try-catch,都会显示错误。
答案 0 :(得分:9)
通过使用类型检查器,您将选择执行它的规则。访问可空类型的属性是这些限制之一。因此,如果您想要为null值设置异常,则需要显式抛出以向Flow证明它是您想要的。例如,您可以创建一个类似
的模块if (!document.body) throw new Error("Unexpectedly missing <body>.");
export const body: HTMLElement = document.body;
export function querySelector(el: HTMLElement, selector: string): HTMLElement {
const result = el.querySelector(selector);
if (!result) throw new Error(`Failed to match: ${selector}`);
return result;
}
通过抛出,这些函数在所有情况下都明确地说“我将返回一个元素”,并且在null
情况下,它们将抛出异常。
然后在您的普通代码中,您可以保证可以使用这些
import {body, querySelector} from "./utils";
body.appendChild(document.createElement('div'));
querySelector(body, 'div').setAttribute('thing', 'value');
并且它将检查属性。
答案 1 :(得分:0)
当我确定我的变量不会为null并且Flow不会为空时,我使用unwrap()函数:
def tlstest():
hostAddress = 'x'
hostPort = xxxx
serverHostName = 'x.com'
client_cert = 'D:\ssl\client.pem'
clients_key = 'D:\ssl\clientKey.pem'
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_cert_chain(certfile=client_cert, keyfile=clients_key,
password=None)
context.verify_mode = ssl.CERT_REQUIRED