插件窝 干货文章 TypeScript模块声明覆盖:如何扩展store包的StoreJsAPI的set方法?

TypeScript模块声明覆盖:如何扩展store包的StoreJsAPI的set方法?

store 方法 ExtendedStore value 330    来源:    2025-03-26

扩展StoreJsAPI的set方法

在TypeScript中扩展第三方库的类型声明是一个常见需求。下面我将介绍如何扩展store.js包的StoreJsAPI接口的set方法。

方法一:使用声明合并

  1. 首先,在你的项目中创建一个类型声明文件(如storejs.d.ts
// storejs.d.ts
import 'store';

declare module 'store' {
  interface StoreJsAPI {
    // 扩展set方法
    set<T>(key: string, value: T, expires?: number): T;
    // 或者完全重写set方法
    // set: <T>(key: string, value: T, expires?: number) => T;
  }
}

方法二:创建包装函数

如果你不想修改原始类型声明,可以创建一个包装函数:

import store from 'store';

interface ExtendedStore extends StoreJsAPI {
  setWithExpiry<T>(key: string, value: T, expires: number): T;
}

const extendedStore: ExtendedStore = {
  ...store,
  setWithExpiry<T>(key: string, value: T, expires: number): T {
    // 你的实现逻辑
    return store.set(key, value);
  }
};

export default extendedStore;

方法三:使用类型断言

如果你只需要临时扩展类型:

import store from 'store';

(store as any).setWithExpiry = function<T>(key: string, value: T, expires: number): T {
  // 实现逻辑
  return store.set(key, value);
};

最佳实践建议

  1. 声明合并是最干净的方式,但需要确保不会与库的未来更新冲突
  2. 考虑创建一个包装类而不是直接修改原型
  3. 如果你需要添加大量新功能,考虑派生一个新类
class ExtendedStore {
  constructor(private store: StoreJsAPI) {}

  set<T>(key: string, value: T, expires?: number): T {
    // 你的自定义逻辑
    return this.store.set(key, value);
  }

  // 其他方法...
}

const myStore = new ExtendedStore(store);

选择哪种方法取决于你的具体需求和项目规模。对于简单的扩展,声明合并通常是最简洁的解决方案。