【问题标题】:Typescript for a promise that resolves an array of objects用于解析对象数组的 Promise 的打字稿
【发布时间】:2018-08-29 22:17:25
【问题描述】:

我想通常声明一个函数返回一个解析对象数组的承诺(我认为这将解决 TS 错误;TS 不知道我可以在解析的数组上使用 forEach) .

在openJSON() 函数上(见下文)我尝试过类似的操作:

function OpenJSON(): Promise<Array<{id: string, performance: number, average: number}>> { // ...

但我仍然遇到错误。并且在未来,我希望这个函数能够产生各种不同的对象。有没有一种通用的方法来声明一个对象数组,比如Promise&lt;Array&lt;{}&gt;&gt;?

async function produceDataRows() {
   let tableContent = '';
   let jsonData = await OpenJSON();

   // error occurs here: [ts] Property 'forEach' does not exist on type '{}'.
   jsonData.forEach(element => {
       // convert this JSON data into table content
   });
   return tableContent;
};

function OpenJSON() {
   return new Promise( (resolve, reject) => {
      fs.open(kJsonPath, 'wx', (err, fd) => {
         if (err) {
            if (err.code === 'EEXIST') {
               fs.readFile(kJsonPath, 'utf8', function (err, content) {
                  if (err) throw err;
                  resolve(JSON.parse(content));
               })
            } else {
               reject( new Error('When openening performance.JSON, in generateHTML.js, an unexpected error has occured. ' + err) );
            }
         } else throw Error('There is a problem opening performance.JSON');
      })
   })
}

【问题讨论】:

  • 没有打字稿有一些关键字可以让你指定any类型吗?
  • 原来的错误是[ts] Property 'forEach' does not exist on type '{}'。现在我得到 SyntaxError: Unexpected token : 类似 Promise>
  • 它编译得很好in the playground。从外观上看,Promise&lt;Array&lt;any&gt;&gt; 或 Promise&lt;any[]&gt; 是 OpenJSON 的正确类型。
  • @jonrsharpe 可以,但--noImplicitAny 不行。无论如何,没有必要使用any,除非你想表达你不知道 JSON 是什么样子的。

标签: javascript arrays typescript promise


【解决方案1】:

在这种情况下,您需要在构造 Promise 时指定结果类型。

function OpenJSON() {
    return new Promise<Array<{ id: string, performance: number, average: number }>>(
        (resolve, reject) => {
            fs.open(kJsonPath, 'wx', (err, fd) => {
                if (err) {
                    if (err.code === 'EEXIST') {
                        fs.readFile(kJsonPath, 'utf8', (err, content) => {
                            if (err) {
                                reject(err);
                            }
                            resolve(JSON.parse(content));
                        })
                    } else {
                        reject(Error('When openening performance.JSON'));
                    }
                } else {
                    reject(Error('There is a problem opening performance.JSON'));
                }
            });
        });
}

注意在上面,我修复了几个错误处理问题。

Playground link

【讨论】:

  • 感谢您的快速回复。我已粘贴您的代码,但现在出现此错误:(node:13688) UnhandledPromiseRejectionWarning: TypeError: Promise resolver undefined is not a function
  • @chamilton 这是因为我修复了一些错误,您没有将错误转换为承诺回调中的拒绝。您的代码抛出错误。
  • 酷,感谢@Aluan Haddad 的链接。我看看能不能解决错误。
  • @unional:我很确定您的编辑引入了语法错误。什么原因?
猜你喜欢
  • 2023-02-03
  • 2020-10-24
  • 2019-01-13
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 2019-02-08
相关资源
最近更新 更多