如何用打字稿定义事件?

时间:2017-03-01 07:32:20

标签: angularjs typescript

我正在使用angular1.5和打字稿。我正在尝试遵循关于one-way-dataflow

的todd-motto风格指南

我有两个组件: app (statefull)及其子管理对话

app包含活动列表

manage-dialog是一个表单,用于更改所有选定事件的时间属性(小时和分钟)。

更改将作为事件传回。

controller: class ManageDialog {
  public evts:Array<Event>;

  save() {
    this.onEdited({$event:{h:this.h,m:this.m}});//i guess this is not correct in typescript
  }
}

因为我正在编写打字稿 - 我应该为事件内部推送的对象(可能是界面)定义一些特殊类型吗?

或者可能是正确的事情是为事件本身定义类型?

(我有很多“批量”表格应该编辑不同的属性 - 所以定义很多类型是正确的吗?)

plnkr演示了我的问题

3 个答案:

答案 0 :(得分:2)

我认为Sefi Ninio提出了一个很好的观点。如果您坚持要输入所有内容,则可以使用以下表单:

class ItemsInEvent {
      constructor(public item:string){}
}
class BindedEvent {
      constructor(public $event:ItemsInEvent){}
}
// Inside your controller:
export class MyCtrl {
       public bindedEvent: (BindedEvent)=>void;//Declare the bound method 
       public someMethod():void {
              let myBindedItem:ItemsInEvent = new ItemsInEvent ("foo");
              let myBindedEvent:BindedEvent = new BindedEvent (myBindedItem);
              // Trigger event
              this.bindedEvent(myBindedEvent);
       }
}
// Component definition:
export class MyComponent implements IComponentOptions {
       bindings: {
               bindedEvent: '&'
       }
}

答案 1 :(得分:1)

从技术上讲,我认为这是正确的。您正在使用TypeScript来使用类型,因此请使用它们 - 特别是如果您在代码中有很多地方使用它们(例如您的Event对象)。

但是,我会小心不要过火。我不想为我使用的每个对象创建一个对象类型(接口) - 这会非常快速。

不是&#34;严格打字&#34;像Java这样的语言采用的方法(一切都是一种类型),但在类型安全和理智之间存在中间立场:)

答案 2 :(得分:0)

我会将数据与事件本身分开,并使用泛型来解决这个问题。

该事件可以是一个泛型类,其成员名为“data”,带有type参数,然后数据就可以传递。

p.s the drag&amp; drop事件在javascript中使用这种方法(好吧,不是打字稿的通用部分)。