javascript - typescript :使用不同类型的相同类

标签 javascript typescript types

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

我有一个使用和创建特定对象的类定义,比方说一个 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);
  }
}

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

最佳答案

您可以使用泛型为不同的类型实例化类。在运行时泛型被删除,你将有一个单一的 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)

关于javascript - typescript :使用不同类型的相同类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50504566/

相关文章:

javascript - 工具提示 z-index 位置或其他?

javascript - 如何让 jquery 选择已使用 client.open 加载的 html 中的类

javascript - addEventListener ("transitionend"问题,功能,真)

javascript - 将对象数组值转换为整数值

node.js - Sequelize 连接和日志记录问题

javascript - 使 .appendTo() 适用于第一个元素?

node.js - 为什么 --module 会覆盖 Typescript 编译器的 --out 标志?

pointers - 如何将类型存储为成员?

ruby-on-rails - 如何将表列转换为另一种数据类型

assembly - 如何在反汇编的C/C++程序中重建类型和数据结构?