You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:58:29