一次TS联合类型推断bug处理
在使用await-to-js这个库的时候,发现了一个类型问题,如下图
async login(loginForm: LoginData) {
const [err, res] = await login(loginForm);
if (err) {
clearToken();
}
setToken(res.data.jsesessionid);
},

再附上await-to-js的类型定义
declare function to<T, U = Error>(promise: Promise<T>, errorExt?: object): Promise<[U, undefined] | [null, T]>;
很奇怪,这里我期望的是,TS能自动推断出下面setToken代码这里,类型为 [null, T]这个子项,这样res类型为 T 必然存在。
但是TS报错了,TS表示,你这里的 res 任然是联合类型 T | undefined,我百思不得其解...
于是在群里开水了

没人理我,经过了1分钟的快速思考,我突然换了一种编码方式
async login(loginForm: LoginData) {
const [err, res] = await login(loginForm);
if (!err) {
setToken(res.data.jsesessionid);
}
clearToken();
},

欸,不报错了,能够推断出res的类型了,好耶!
这么看来,这TS类型推断只能反着来?于是我大言不惭的在群里开始结帖,欸,这一定是TS的问题,它推断不出来。

不过,万幸的是,很快哈,牛批的群友立马指出了错误,为TS洗刷了冤屈。

原来是,我自己忘了在 err 的存在条件语句中 return 了,这样自然后面的语句依然是存在两种类型情况的。
真的结帖
TS类型推断肥肠智能,当我们用 if(err)对err进行类型保护后,在else 或if return 后的语句,TS能够自动推断出,这里的err类型为null,那么res自然就是T了。
PS:有群友发出了跟我一样的疑问

最后:一次粗心的经历,让我对TS的认识加深了,
await-to-js听我说谢谢你......


