我有这个TSPlayground设置
基本上我的问题是我试图做一个promise Package 器,它返回一个结果为null或null和错误的元组,基本上我希望发生这种情况:
const [data, error] = await safePromise(wait());
我遇到的问题是,如果我想以字符串的形式返回错误,在我检查错误存在之后,它不能正确地推断数据的类型。
const [data, error] = await safePromise(wait());
if (error) {
return error;
}
return doSomethingWith(data) // Val | null, when it should be Val
我发现令我难以置信的是,如果我返回一个字符串数组或一个Object(类似于:{ message:string }),它工作得完美无缺。我发现的另一件事是,如果我有同样的事情,但使用not promise和not try catch typescript知道发生了什么,并正确推断类型,promise会做什么来防止这种情况发生?
所以我找到了一种解决方法,但我只是好奇为什么这种奇怪的行为是,我能做些什么来解决它。而且如果有一种方法告诉typescript函数的返回值严格地是[Type,null]或[null,error],那么它知道如果有错误,则定义Type;
safePromise的实现:
async function safePromise<T>(promise: Promise<T>) {
try {
const res = await promise;
return [res, null] as const;
} catch (err) {
return [null, err as IErr] as const;
}
}
1条答案
按热度按时间lqfhib0f1#
你在这里使用了错误的类型保护:
下面是问题的根源,当
error
是一个空字符串''
时会发生什么。你的类型守卫被绕过了。
而是使用
typeof
类型保护。链接到操场