为什么对象属性在typescript转换时不存在但在运行时它是否存在?

时间:2017-10-25 10:50:05

标签: javascript typescript

Typescript无法转换我的代码,因为它认为对象方法不存在。

在运行时,当promise已解决时,该方法确实存在。它只是在打字稿试图转换时不存在,因为Promise被返回。

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

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)
    })
});

然后我收到打字稿错误:Property 'setCredentials' does not exist on type '{}'

如果我改变我的generateOauthClient函数以返回回调而不是返回一个promise,那么typescript就可以了。

我如何解决这个问题,以便使用promises而不是回调?

1 个答案:

答案 0 :(得分:1)

你需要告诉Typescript你的var startTime = Date.now(); setTimeout(function(){ var elapsedTime = Date.now() - startTime; // Additional code to calculate hour, minute, second, milisecond here }, 10); 会返回什么。这将允许Typescript使用您使用的语法(async / await或.then)检查您对结果的处理方式:

Promise