从返回值推断类型

时间:2019-05-14 01:43:12

标签: typescript

如果检查该变量是否存在是在另一个函数中完成的,则Typescript似乎无法推断该变量不是undefinedconst 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' } } 。这是一个例子。

(我正在使用Typescript并打开--strictNullChecks。)

handleButtonClick

Typescript在login中抱怨您无法用可能未定义的电子邮件呼叫email。但是,我们确保在validate调用中定义了{{1}}。

Typescript是否可以解决这个问题?

1 个答案:

答案 0 :(得分:5)

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

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

    return login(email!);
}

我讨厌非null的断言。我有时避免这种情况的一种方法是将我的验证器函数转换为type-guard,从技术上讲,该函数只返回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;
}

Example in playground(在选项中选中strictNullChecks