Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript msal typescript错误属性';accessToken';不存在于类型';void | TokenResponse';_Javascript_Typescript - Fatal编程技术网

Javascript msal typescript错误属性';accessToken';不存在于类型';void | TokenResponse';

Javascript msal typescript错误属性';accessToken';不存在于类型';void | TokenResponse';,javascript,typescript,Javascript,Typescript,下面的代码为响应生成以下类型脚本错误。accessToken: TS2339:类型“void | TokenResponse”上不存在属性“accessToken”。 import*作为Msal从'@azure/Msal浏览器' 导出异步函数GetTokenPup(请求:Msal.TokenExchangeParameters){ return wait auth.acquireTokenSilent(请求).catch(异步()=>{ return wait auth.acquireToke

下面的代码为
响应生成以下类型脚本错误。accessToken

TS2339:类型“void | TokenResponse”上不存在属性“accessToken”。

import*作为Msal从'@azure/Msal浏览器'
导出异步函数GetTokenPup(请求:Msal.TokenExchangeParameters){
return wait auth.acquireTokenSilent(请求).catch(异步()=>{
return wait auth.acquireTokenPopup(请求).catch((错误)=>{
console.log('使用弹出窗口登录失败:',错误)
})
})
}
常量getGraphDetails=async(
uri:string,
作用域:Msal.TokenExchangeParameters,
axiosConfig?:AxiosRequestConfig
) => {
返回getTokenPup(作用域)。然后((响应)=>{
返回调用图(uri、response.accessToken、axiosConfig)
})
}
检查TokenResponse时,它清楚地表明属性
accessToken
在对象上可用:

export-type-TokenResponse=AuthResponse&{
唯一的:字符串;
tenantId:字符串;
作用域:数组;
令牌类型:字符串;
idToken:字符串;
idtokenclaits:StringDict;
accessToken:字符串;
刷新令牌:字符串;
到期日:日期;
账户:账户;
};

我做错了什么?

尽管您正在使用
wait
,但请注意您的
捕获。我会这样写代码:

import * as Msal from '@azure/msal-browser'

export async function getTokenPopup(request: Msal.TokenExchangeParameters) {
    try {
        return await auth.acquireTokenSilent(request);
    } catch (error) {
        return await auth.acquireTokenPopup(request);
    }
}

const getGraphDetails = async (
    uri: string,
    scopes: Msal.TokenExchangeParameters,
    axiosConfig?: AxiosRequestConfig
) => {
    try {
        const response = await getTokenPopup(scopes);
        return callGraph(uri, response.accessToken, axiosConfig);
    } catch (error) {
        throw new Error("You could not get a token");
    }
}
现在,为什么在
响应中得到
无效
。对于
acquireTokenSilent
acquireTokenPopup
,函数
getTokenPopup
可能会失败。因此,函数
getTokenPup
将抛出一个错误(或不返回任何内容,具体取决于您的实现)


TypeScript看到了这一点,并添加了一个
void
类型,以表明可能无法获得回复。

只是一个提示,为什么不使用try/catch with await?TypeScript可能认为您的
getTokenPup
返回void的可能性。如果两个承诺都失败,它将返回void。我只是希望它也能与TS一起工作。我刚刚用
async/away
解决方案测试了您的代码,这就修复了错误。我必须开始这样做,因为它读起来也更容易。感谢您的帮助。似乎TypeScript无法使用
catch
正确推断类型,无论如何,很高兴它有所帮助。