[英]Typescript inference error - variable with type string changes to undefined inside for loop
我正在使用 await-to-js 庫進行錯誤處理(下面示例中的to
方法來自該庫)
由於某種原因,變量的類型更改為string | undefined
在for..of
循環內string | undefined
,當同一變量的值是循環外的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 | undefined
但在其外部是string
?
TypeScript 在分析解構語法中的類型時存在問題。 要獲得預期的行為,請將 to 的解析值分配to
局部變量,並在檢查err
后引用accessToken
。
改變:
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.