如果检查该变量是否存在是在另一个函数中完成的,则Typescript似乎无法推断该变量不是undefined
或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'
}
}
。这是一个例子。
(我正在使用Typescript并打开--strictNullChecks。)
handleButtonClick
Typescript在login
中抱怨您无法用可能未定义的电子邮件呼叫email
。但是,我们确保在validate
调用中定义了{{1}}。
Typescript是否可以解决这个问题?
答案 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
)