【问题标题】:Typescript: interface gets default value for property打字稿:接口获取属性的默认值
【发布时间】:2021-02-18 23:06:18
【问题描述】:

我正在用 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
}

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

【问题讨论】:

  • 这不会发生。 TypeScript 不会设置值,它在运行时不存在。一旦类型被编译删除,你就只有const event = { progress: 83 }
  • @jonrsharpe 有没有办法设置不同事件的类型?所以我不能检查'event.type === EventType.Active'?
  • 你必须做运行时工作; TS 不会根据其静态类型系统发出不同的代码。但是您可以将运行时工作重构为只完成一次……例如,this 是否适合您?

标签: typescript angular11


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 2019-02-13
    • 2017-06-29
    • 2021-12-03
    • 2018-12-13
    • 1970-01-01
    • 2018-07-14
    • 2017-08-04
    • 2021-02-17
    相关资源
    最近更新 更多