Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.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 为什么typescript传输时对象属性不存在,但它在运行时存在?_Javascript_Typescript - Fatal编程技术网

Javascript 为什么typescript传输时对象属性不存在,但它在运行时存在?

Javascript 为什么typescript传输时对象属性不存在,但它在运行时存在?,javascript,typescript,Javascript,Typescript,Typescript无法传输我的代码,因为它认为objects方法不存在 在运行时,当承诺已解决时,该方法确实存在。它只是在typescript尝试传输时不存在,因为承诺已返回 返回解析oauthclient的承诺的My函数: public generateOauthClient(){ return new Promise((resolve, reject) => { // Load client secrets from a local file

Typescript无法传输我的代码,因为它认为objects方法不存在

在运行时,当承诺已解决时,该方法确实存在。它只是在typescript尝试传输时不存在,因为承诺已返回

返回解析oauthclient的承诺的My函数:

public generateOauthClient(){
        return new Promise((resolve, reject) => {

            // Load client secrets from a local file.
            fs.readFile(appConfig.youtube.keyFilename, 'utf8', function processClientSecrets(err, content) {

                if(err) {
                    return reject('Error loading client secret file: ' + err);
                }

                const credentials = JSON.parse(content);

                const clientSecret = credentials.installed.client_secret;
                const clientId = credentials.installed.client_id;
                const redirectUrl = credentials.installed.redirect_uris[0];
                const auth = new googleAuth();
                const oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl);


                resolve(oauth2Client);

            })
        });
    }
然后我试着在代码的其他地方调用它

const oauth2Client = await this.generateOauthClient();

oauth2Client.setCredentials({
    access_token: JSON.parse(tokens).access_token,
    refresh_token: JSON.parse(tokens).refresh_token
});

oauth2Client.refreshAccessToken((err, tokens) => {
    if(err) return reject(err)

    this.storeToken(tokens).then(()=>{
        resolve('Successfully updated tokens')
    }).catch((err2)=> {
        reject(err2)
    })
});
然后我得到了typescript错误:
属性“setCredentials”在类型“{}”上不存在。

如果我将
generateOauthClient
函数更改为返回回调,而不是返回承诺,那么typescript可以正常传输


我如何避免这种情况,以便使用承诺而不是回调?

您需要告诉Typescript您的
承诺将返回什么。这将允许Typescript以您使用的语法(async/await或.then)检查您对结果所做的操作:

新承诺((解决、拒绝)=>{..})

如果我使用
.then()
promise语法而不是
async/await
,它似乎不起作用。我得到了相同的错误关于财产不存在,这是我所缺少的。谢谢你。尽管如此,我还是返回了一个
googleAuth
的实例,因此需要执行此操作:
newpromise((resolve,reject)=>{..})
,这稍微有些不同。
 new Promise<auth.OAuth2>((resolve, reject) => { .. } )