【问题标题】:Typescript: use the same class with different types打字稿:使用具有不同类型的同一类
【发布时间】:2018-11-03 09:34:54
【问题描述】:

在定义类和使用的每个对象的类型时,我真的很喜欢 Typescript 的严格性,但我最近遇到了一些我想成为DRYer 的东西:

我有一个使用和创建特定对象的类定义,比如ClientsDB

class ClientsDB {
  constructor(name: string) {
    this.DB = new Database(name);
  }
  DB: Database;
  replaySubject = new ReplaySubject<Client[]>(1);
  up() {
    fromPromise(this.DB.getDocs<Client>())
      .subscribe((clients) => this.replaySubject.next(clients));
  }
  subscribe(callback: (value: Client[]) => void) {
    return this.replaySubject.subscribe(callback);
  }
}

问题是我想为 ProductsDB 使用相同类型的类,这与纯 JavaScript 中的定义完全相同,但会使用不同的类型:

class ProductsDB {
  constructor(name: string) {
    this.DB = new Database(name);
  }
  DB: Database;
  replaySubject = new ReplaySubject<Product[]>(1);
  up() {
    fromPromise(this.DB.getDocs<Product>())
    .subscribe((products) => this.replaySubject.next(products));
  }
  subscribe(callback: (value: Product[]) => void) {
    return this.replaySubject.subscribe(callback);
  }
}

我怎样才能只得到一个类定义,但对这些类型定义使用相同的严格性?

【问题讨论】:

  • 正如所写,它们实际上并不等价。你的意思是二等座少了一行吗? .pipe(map(...)) 只在第一个。
  • @Duncan 你说得对,我已经为这个例子简化了我的代码,只删除了一行,我会进行编辑!

标签: javascript typescript types


【解决方案1】:

您可以使用泛型为不同类型实例化类。在运行时,泛型被删除,您将拥有一个 JS 类。由于您还需要创建类的对象,因此您需要将项目的构造函数作为参数传递给类:

class DBClient<T> {
    constructor(name: string, public itemCtor: new (data: any) => T) {
        this.DB = new Database(name);
    }
    DB: Database;
    replaySubject = new ReplaySubject<T[]>(1);
    up() {
        fromPromise(this.DB.getDocs<T>())
            .pipe(map(res => res.rows.map(x => new this.itemCtor(x.doc))))
            .subscribe((clients) => this.replaySubject.next(clients));
    }
    subscribe(callback: (value: T[]) => void) {
        return this.replaySubject.subscribe(callback);
    }
}

let products = new DBClient("", Product)
let clients = new DBClient("", Client)

【讨论】:

  • 非常感谢!但是除了itemCtor: new (data: any) =&gt; T,你就不能写点别的吗?
  • 您可以编写不同的构造函数签名...取决于构造函数的参数类型。但它必须在所有支持的类型中保持一致。如果您告诉我您的用例是什么,也许我可以提供帮助
  • 我基本上从数据库中检索 JSON 对象,我将这些对象实例化为特定类的成员,为它们提供方法和 getter/setter,构造函数类似于 Object.assign(this, DBdocument)
  • 那么也许你可以使用itemCtor: new (data: Partial&lt;T&gt;) =&gt; T ?您仍然可能在某些时候分配表单any.. 需要传递类的构造函数。
  • 我找到了一个关于这个构造函数的question,我会使用这个接口方法,即使它要写更多的行!
猜你喜欢
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 2019-05-30
  • 2021-12-17
  • 2023-03-30
  • 2018-11-01
  • 2018-09-22
  • 2020-12-28
相关资源
最近更新 更多