将JS包重写为TS时,如何复用d.ts中的类型定义?
复用已有
.d.ts类型定义,避免TS重写时重复定义 我正在将JS编写的小型包aws-sdk-mock重写为TypeScript,该包已有现成的index.d.ts类型定义文件。想请教如何复用这个文件中的类型,避免在index.ts里重复编写类型定义代码。
相关代码示例
原JS实现(index.js):
const AWS = {}; AWS.mock = function(service, method, replace) { // 实现逻辑 } module.exports = AWS
已有类型定义(index.d.ts):
export function mock<C extends ClientName, M extends MethodName<C>>( service: C, method: M, replace: ReplaceFn<C, M>, ): void;
我当前的TS重构代码(index.ts):
/// <reference path="index.d.ts" /> import { mock } from '.'; type AWS_MOCK = { mock?: typeof mock } const AWS: AWS_MOCK = {} // 这里怎么定义类型才能复用index.d.ts里的定义,不用重复写? AWS.mock = function(service, method, replace) { }
ESLint已经通过AWS_MOCK类型识别出AWS.mock应有的函数类型,但我不确定是否需要像下面这样重复写index.d.ts里的泛型和参数类型:
AWS.mock = function<C extends ClientName, M extends MethodName<C>> (service: C, method: M, replace: ReplaceFn<C, M>) { }
这种重复写法很冗余,尤其是当mock有多个重载类型时。有没有更高效的方式?
解决方案:无需重复定义类型,利用TS自动推断或类型提取
1. 依赖类型推断自动校验
因为AWS已经被AWS_MOCK类型约束,TypeScript会自动根据typeof mock的类型来校验你赋值的函数,完全不需要手动重复写泛型和参数类型:
/// <reference path="index.d.ts" /> import { mock } from '.'; type AWS_MOCK = { mock?: typeof mock } const AWS: AWS_MOCK = {} // TS会自动推断参数、泛型约束和返回值类型,无需手动定义 AWS.mock = function(service, method, replace) { // 实现你的逻辑即可 }
此时如果你的函数参数或返回值不符合index.d.ts里的定义,TS会直接抛出错误,相当于自动复用了已有类型。
2. 显式提取函数类型(更清晰的写法)
如果想让代码意图更明确,可以先提取mock的函数类型,再用它约束实现函数:
/// <reference path="index.d.ts" /> import { mock } from '.'; // 从已有mock导出中提取函数类型 type MockFunction = typeof mock; // 直接用提取的类型约束实现函数 const mockImplementation: MockFunction = (service, method, replace) => { // 实现逻辑 }; const AWS = { mock: mockImplementation };
或者用类型断言简化写法:
const AWS = { mock: (service, method, replace) => { // 实现逻辑 } as MockFunction };
注意事项
- 确保
index.d.ts中用到的辅助类型(如ClientName、MethodName、ReplaceFn)是可导出的,或者能通过typeof mock间接访问到,否则TS会提示类型找不到的错误。 - 如果
mock有多个重载类型,typeof mock会自动包含所有重载,TS会对实现函数进行全量校验,无需手动逐个定义重载。
内容的提问来源于stack exchange,提问作者LuchoTurtle
相关产品推荐
相关产品推荐

