从返回值推断类型

Bez*_*ezR 4 typescript

看来Typescript无法推断出一个变量不是,null或者undefined该变量是否存在的检查是在另一个函数中完成的。这是一个例子。

(我在打开--strictNullChecks的情况下使用Typescript。)

const login = (email: string) => {
    console.log(email);
}

const handleButtonClick = (email?: string) => {
    const error = validate(email);
    if (error) {
        return;
    }

    return login(email);
}

const validate = (email?: string) => {
    if (!email) {
        return 'There was an error'
    }
}
Run Code Online (Sandbox Code Playgroud)

Typescript抱怨handleButtonClick您无法login使用可能未定义的电子邮件进行呼叫。但是,我们确保emailvalidate调用中定义了它。

Typescript是否有可能解决这个问题?

Aar*_*all 5

没错,TypeScript不会跟踪在当前函数之外进行的缩小。这是何时使用非null断言的示例之一:

const handleButtonClick = (email?: string) => {
    const error = validate(email);
    if (error) {
        return;
    }

    return login(email!);
}
Run Code Online (Sandbox Code Playgroud)

我讨厌非空的断言。我有时避免这种情况的一种方法是将我的验证器函数变成类型保护,从技术上讲,它仅返回true或false,还可以在调用站点启用类型范围缩小:

const login = (email: string) => {
    console.log(email);
}

const handleButtonClick = (email?: string) => {
    if (isValidEmail(email)) {
        return login(email);
    }
    console.log("Invalid email!");
}

const isValidEmail = (email?: string): email is string => {
    return !!email;
}
Run Code Online (Sandbox Code Playgroud)

操场上的例子(签strictNullChecks入选项)