我正在使用 await-to-js 库进行错误处理(下面示例中的 to
方法来自该库)
由于某种原因,变量的类型变为string | undefined
在 for..of
循环内,当同一变量的值在循环外为 string
时。
考虑以下示例(有关错误,请参阅 testMethod
):
function to<T, U = Error>(
promise: Promise<T>,
errorExt?: object
): Promise<[U, undefined] | [null, T]> {
return promise
.then<[null, T]>((data: T) => [null, data])
.catch<[U, undefined]>((err: U) => {
if (errorExt) {
const parsedError = Object.assign({}, err, errorExt);
return [parsedError, undefined];
}
return [err, undefined];
});
}
async function retrieveAccessToken(): Promise<string> {
const randomNumber = Math.random();
if(randomNumber < 0.5) {
throw new Error("Failed");
}
return "testToken";
}
function printAccessToken(accessToken: string) {
console.log(accessToken);
};
async function testMethod(): Promise<boolean> {
const accessTokenPromise = retrieveAccessToken();
const [err, accessToken] = await to(accessTokenPromise);
if(err){
console.log("Failed");
return false;
}
// No error here
printAccessToken(accessToken);
for(let i = 0 ; i < 5; i++){
// Error! Type Argument of type 'string | undefined' is not assignable to
// parameter of type 'string'.
printAccessToken(accessToken);
}
return true;
}
这似乎可以通过在 accessToken 上添加一个 if 检查来解决,例如if(!accessToken)
然而,为什么 accessToken
的类型是 string | 没有意义undefined
在 for 循环内部,但 string
在它外部?
最佳答案
TypeScript 在分析解构语法中的类型时存在问题。要获得预期的行为,请将解析后的 to
值分配给局部变量,并引用 accessToken
after 检查 err
.
改变:
const [err, accessToken] = await to(accessTokenPromise);
if(err){
console.log("Failed");
return false;
}
进入:
const toResult = await to(accessTokenPromise);
const [err] = toResult;
if(err){
console.log("Failed");
return false;
}
const [, accessToken] = toResult;
关于javascript - typescript 推理错误-类型为字符串的变量在for循环内更改为未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71910181/