【问题标题】:'Type 'void' is not assignable to type ... (Custom Type)'类型'void'不可分配给类型......(自定义类型)
【发布时间】:2017-10-01 17:47:20
【问题描述】:

我已经研究这个错误几天了,但我仍然不能很好地理解我需要在我的代码中具体做什么。

我正在通过 firebase 从云中检索数据,并将其加载到我的 Ionic 2 应用程序的 html 中。除了这一点,一切都很好。

我不知道如何让我的方法getData() 被识别为返回我构建的自定义类型/对象数组。相反,TypeScript 只将该方法识别为返回“void”。

如果我从承诺中取出return 调用,该方法将被识别为返回正确的类型。但是,它将返回空,因为在调用 return 之前需要更多时间来检索数据。

以下是这两个文件及其代码。 home.ts 文件控制着我的应用程序的主页。 data.ts 文件是我要导入到我的文件中以完成工作的数据服务。

我需要做什么来纠正这个错误并返回promise中的数据?

感谢观看!

home.ts:

// This is a custom object that I am importing & using in arrays.
listData: DataComponent[][];

loadData() {
  this.listData = this.dataService.getData();
}

data.ts:

// Again, this is the custom object that I am importing & using below.
private dataArray: DataComponent[][];

getData() {
    // This is my connection to firebase.
    this.db.ref('Data/').once('value')
        .then(data => {
            var obj = data.val();
            this.dataArray = Object.keys(obj).map(function(e) { return obj[e] });
            return this.dataArray.slice();
        });
}

【问题讨论】:

  • 您缺少外部回报。那是return this.db.ref('Data/').once('value')
  • 不应该在loadData()函数中处理promise吗?
  • @birwin 你所说的“履行承诺”是什么意思?
  • 不确定,但我在想你的 getData() 函数应该返回一个承诺,而你的 loadData 函数应该调用 .then 在从 getData() 调用返回的承诺上......this.dataService.getData().then()跨度>
  • @aluan Firebase documentation 是这样解释的:在某些情况下,您可能需要在不监听更改的情况下获取数据的快照,例如在初始化您不希望更改的 UI 元素时。您可以使用once() 方法来简化此场景:它触发一次,然后不再触发。

标签: angular typescript firebase promise ionic2


【解决方案1】:

也许是这样的?

getData(): Promise<DataComponent[][]> {
    return this.db.ref('Data/').once('value').then(data => {
            var obj = data.val();
            return <DataComponent[][]> Object.keys(obj).map(function(e) { return obj[e] };
        });
}

第一个 return 返回结果,但在一个包含 DataComponent[][] 的 Promise 中。第二个返回是匿名函数(又名 lambda 函数)的一部分,它将来自 Firebase 的数据转换为您的 DataComponent[][]

你会这样使用它:

loadData() {
  this.dataService.getData().then(data => this.listData = data);
}

我认为阅读 Promise 对你来说是明智的。

【讨论】:

  • @AluanHaddad 据我所知 lambda 函数和匿名函数是同义词吗?我错过了什么吗?
  • 谢谢,我尝试了您的解决方案,但出现此错误:'Type 'Promise' 不可分配给 type 'Promise'。 'then' 的属性类型是不兼容的。 另外,我尝试对 Promises 进行一些阅读,但在理解它们时遇到了很多困难。我不确定您是否会向完全不了解它们的人(我)推荐任何材料。
  • 我已向DataComponent[][] 添加了演员表。问题是我实际上无法检查这是否真的正确,因为我不知道DataComponent 是什么,也不知道转换后的数据是否与它对应。我真的没有一个链接来了解更多关于承诺的信息,但互联网应该充满了它。如果你找不到你理解的东西,不要逗留太久,直接去找你理解的东西。
  • 当我从方法声明中删除 : Promise&lt;DataComponent[][]&gt; 时,错误消失,您的解决方案有效。例如,上面写着:getData() { 而不是 getData(): Promise&lt;DataComponent[][]&gt; {...谢谢!
  • 让编译器通过=return=&gt;从值推断类型无论如何都是一个好习惯。
猜你喜欢
  • 2018-01-04
  • 2021-09-23
  • 2019-05-12
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 2019-05-06
  • 2020-10-01
相关资源
最近更新 更多