如何在TypeScript中正确组合AuditableStore与SearchableStore类
TypeScript组合AuditableStore与SearchableStore实现MyStore
现有类定义
Store.ts
export class Store<T extends { key: string }> { protected readonly storeOptions?: StoreOptions<T>; private readonly storeName: string; constructor(storeName: string, options?: StoreOptions<T>) { this.storeName = storeName; this.storeOptions = options; } save(data: T) { console.log('Save Implementation'); } protected beforeSave(entity: T): T { console.log('Default Before Save'); return entity; } // ...other store functions }
AuditableStore.ts
import { Store } from './Store'; export class AuditableStore<T extends { key: string }> extends Store<T> { protected readonly auditUser: string; constructor( storeName: string, options: StoreOptions<T> = {}, auditUser: string, ) { super(storeName, options); this.auditUser = auditUser; } protected beforeSave(data: T): T { console.log('Execute some audit logic'); return data; } }
SearchableStore.ts
import { Store } from './Store'; export class SearchableStore<T extends { key: string }> extends Store<T> { constructor( storeName: string, options: StoreOptions<T> = {}, ) { super(storeName, options); } save(data: T) { super.save(data); console.log('Implement searchable logic here'); } }
期望目标
- 调用
myStore.beforeSave(data)时使用AuditableStore的逻辑 - 调用
myStore.save(data)时使用SearchableStore的逻辑 - 确保MyStore可访问Store的所有其他功能(如delete、read、update)
问题解答
1. 组合是否是最佳方案?
是的。TypeScript不支持多继承,无法让MyStore同时继承两个子类。而组合能灵活整合多个类的功能,避免继承带来的层级耦合,完全符合“组合优于继承”的设计原则。
2. 如何组合两者到MyStore并保留功能?
核心思路是让MyStore继承Store基类以直接复用公共方法,同时持有AuditableStore和SearchableStore的实例,重写需要整合逻辑的方法并调用对应实例的逻辑。实现示例如下:
import { Store } from './Store'; import { AuditableStore } from './AuditableStore'; import { SearchableStore } from './SearchableStore'; export class MyStore<T extends { key: string }> extends Store<T> { private readonly auditableStore: AuditableStore<T>; private readonly searchableStore: SearchableStore<T>; constructor( storeName: string, options: StoreOptions<T> = {}, auditUser: string ) { super(storeName, options); this.auditableStore = new AuditableStore(storeName, options, auditUser); this.searchableStore = new SearchableStore(storeName, options); } // 复用AuditableStore的beforeSave逻辑 protected beforeSave(data: T): T { return this.auditableStore.beforeSave(data); } // 复用SearchableStore的save逻辑,同时先执行审计处理 save(data: T) { const processedData = this.beforeSave(data); this.searchableStore.save(processedData); } // delete、read、update等方法直接继承自Store,无需额外实现 }
3. 如何确保正确实现审计与搜索特性?
- 审计逻辑验证:MyStore的
beforeSave直接调用AuditableStore的同名方法,调用myStore.save(data)时会先输出Execute some audit logic,确认审计逻辑生效。 - 搜索逻辑验证:MyStore的
save调用SearchableStore的save方法,会依次输出Save Implementation(Store基类逻辑)和Implement searchable logic here(搜索逻辑),确认搜索功能正常。 - 基类功能保留:因MyStore直接继承Store,delete、read、update等方法可直接调用,无需额外处理。
内容的提问来源于stack exchange,提问作者BSimpson
相关产品推荐
相关产品推荐

