插件增强界面

问题描述 投票:0回答:1

我正在开发一个允许/启用“插件”的“管理器”类。每个插件将(可选)增加管理器类的

data
成员。

// manager.ts
interface Data {
    // some props
}

class Manager {
    data: Data;
    // TSC Problem: "Property 'data' has no initializer and is not definitely assigned in the constructor."

    constructor() {
        // can not set all possible properties of this.data because
        // the Manager class doesn't know what all will be plugged in
    }
}

插件获取对其插入的类实例的引用。它们还可以增强

Data
的接口以更好定义数据对象?

// plugins/A.ts
interface Data {
    // additional props
}

function A(boss: Manager) {
    // "A" adds data to boss.data that is unique to "A"
}

这些是我认为的问题:

  1. 这是一个好的模式吗?
  2. 这是实现这一目标的方法,还是有更好的方法?

我读到了有关声明合并的内容(https://www.typescriptlang.org/docs/handbook/declaration-merging.html),这听起来像是我的情况下的最佳选择,因为会有许多插件都是独立的并且受歧视的工会(https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#union-types)可能很快就不再是问题了。

编辑:也许我的问题不清楚;是否可以跨多个文件使用声明合并?

typescript interface static-typing
1个回答
0
投票

您收到错误消息是因为您在将

data
属性标记为类型
Data
时没有为其赋值。您可以通过构造函数设置该值:

interface Data {
  name: string;
}

class Manager {
  public data: Data;

  constructor(data: Data) {
    this.data = data;
  }
}

并创建这样的对象:

const boss: Manager = new Manager({ name: "boss" });
© www.soinside.com 2019 - 2024. All rights reserved.