Flowtype不断要求空检查

时间:2017-02-21 20:48:21

标签: flowtype

我想知道如何避免这些无效的空检查,或者至少明白这一点是什么,因为它似乎适得其反。

如果省略空检查,

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,都会显示错误。

2 个答案:

答案 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