【问题标题】:Typescript + Ionic: Using filter on an ObjectTypescript + Ionic:在对象上使用过滤器
【发布时间】:2018-02-03 11:02:49
【问题描述】:

我正在使用 Ionic 3.x。

我编写了一个基本的聊天应用程序,并希望能够过滤聊天中的单词。

我刚刚尝试在我的应用程序中实现一个搜索栏。我像这样修改了 HTML 文件:

<ion-searchbar (ionInput)="getItems($event)"></ion-searchbar>
<ion-item *ngFor="let chat of tempChats">

在 HTML 文件中,我有一个对象数组:

chats: Object[]=[];
tempChats: Object[]=[];

我后来填写了带有消息和标题的聊天。像这样:

this.chats.push({author: 'Jim',message: 'Hi!'});

然后我写了一个initializeChats函数和一个getItems函数:

initializeChats(){
   this.tempChats=this.chats;
}

getItems(){
  this.initializeChats();
  let val = ev.target.value;
  if (val && val.trim() != '') {
    this.tempChats = this.tempChats.filter((chat) => {
      return (chat.message.toLowerCase().indexOf(val.toLowerCase()) > -1);
    })
  }
}

不幸的是,这给出了错误: “对象”类型上不存在属性“消息”。

有人知道如何解决这个问题吗?

非常感谢您!

编辑: 做类似的事情

for(chat of chats){
  alert(chat.name);
}

有效。

【问题讨论】:

    标签: angular typescript filter ionic2 ionic3


    【解决方案1】:

    错误只是 Typescript 抱怨 chats 属性的类型,因为 Object 类型定义没有定义 message 属性。

    而不是这个:

    chats: Object[]=[];
    tempChats: Object[]=[];
    

    像这样声明两个属性:

    chats: Array<{ author: string, message: string }> = [];
    tempChats: Array<{ author: string, message: string }> = [];
    

    这样,您告诉 Typescript chats 属性是一个数组,并且该数组的每个对象都有两个属性,一个 message 和一个 author(都是字符串类型)。

    编辑

    处理这个问题的更好方法是创建一个具有这些属性的新类,像这样

    export class ChatMessage {
      public author: string;
      public message: string;
    }
    

    然后你可以使用它来声明chats 属性,像这样

    chats: Array<ChatMessage> = [];
    tempChats: Array<ChatMessage> = [];
    

    更新

    同样,错误不是因为chats 属性的每个对象中不存在该属性,而是因为 Typescript 认为该数组中的每个对象 if 的类型为 Object 并且知道类型为 Object没有名为message 的属性。这是与 Typescript 相关的错误(因此,在编译时)。

    如果你不知道那个类的形状,你可以通过像这样声明两个数组来让 Typescript 知道这一点:

    chats: Array<any> = [];
    tempChats: Array<any> = [];
    

    通过使用any,您可以让 Typescript 知道该数组中的每个对象都可以是任何东西,并且可以避免您面临的错误。

    【讨论】:

    • 感谢您的快速答复,但不幸的是,这是不可能的。我从服务器获取聊天消息(没有涉及太多复杂的细节),但它们的形式必须是动态的。不过,他们有一个共同点,那就是他们总是有一个作者和一个信息。另一个奇怪的事情是,如果我要为(let chat of chats){ alert(chat.message)} 写这样的东西,它会起作用。
    • 好的,我已经更新了答案。请注意,Typescript 仅在编译时检查类型,因此该错误并不意味着该对象实际上没有具有该名称的属性,只是 Typescript 不知道这一点。通过使用any,它应该可以正常工作:)
    • 你的回答很好:) 但是使用 any 代替 object 有什么缺点吗?这样是否会使应用程序显着变慢?
    • 不,一点也不。 Typescript 仅检查类型并帮助开发人员避免常见问题,例如将数字分配给字符串属性等(在 javascript 中非常常见)。但最后 Typescript 代码被转译为纯 javascript,因此在 javascript 代码的末尾将属性声明为 anyObject 完全相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2018-12-14
    • 2021-09-24
    • 2017-12-12
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    相关资源
    最近更新 更多