在定义类和使用的每个对象的类型时,我真的很喜欢 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/