打字稿:接口获取属性

时间:2021-02-18 14:45:40

标签: typescript angular11

我正在用 angular 11 编写一个具有不同类型事件的事件系统
我正在为不同类型的事件定义一个枚举

enum EventTypes {
  Pending,
  Active,
  Complete
}

和不同事件的接口

interface PendingEvent { type: EventTypes.Pending }

interface ActiveEvent { type: EventTypes.Active, progress: number }

interface CompleteEvent { type: EventTypes.Complete, data: any }

然后我定义一个类型来捆绑这些事件

type Event = PendingEvent | ActiveEvent | CompleteEvent;

但是现在,每次我创建一个新事件时,我都必须给出一个类型。

const event: ActiveEvent = {
  progress: 83
}

我收到一条错误消息,说我缺少“类型”属性。
我希望根据我创建的事件类型自动设置类型。

1 个答案:

答案 0 :(得分:0)

如果您使用类,您可能能够实现您想要的。如果您愿意,您甚至可以保留该界面,或将其简化为一个界面。

interface EventInterface { type: EventTypes; progress?: number; data?: any}
class ActiveEvent implements EventInterface {
   constructor (progress: number) {
     this.type =  EventTypes.Active;
     this.progress = progress;
     }
}
const event = new ActiveEvent(82);

类似地,您可以为其他两种类型的事件创建类,由构造函数自动设置类型。

当然,类和类的实例与您现在拥有的类型化变量不同,但听起来这可能有助于您的(我猜到的)用例。

此处的信息可能会有所帮助:https://www.typescriptlang.org/docs/handbook/interfaces.html#implementing-an-interface