从 TypeScript 调用 JavaScript 函数时,如何覆盖推断的类型?

Bri*_*HVB 2 javascript typescript

给定以下JavaScript方法:

class SomeApi {
  async getData(signal = null) {
    const resp = await fetch(url, {signal});
    return resp.json()
  }
}
export default SomeApi()
Run Code Online (Sandbox Code Playgroud)

当我使用下面的TypeScript代码调用它时,出现编译错误,指出Argument of type 'AbortSignal' is not assignable to parameter of type 'null | undefined'

import api from '...'

const abortController = new AbortController();
api.getData(abortController.signal).then(data => console.log);
Run Code Online (Sandbox Code Playgroud)

TypeScript 似乎错误地推断了 JavaScript 函数参数的类型。正确的类型应该类似于AbortConroller | null. 我可以用常见的 hack 来消除错误getData(AbortController.signal as any),但是有更好的方法吗?

假设这SomeApi是一个库函数,我无法更改代码。

Sea*_*ira 5

您无法更改代码,但可以扩展或覆盖类型定义。使用tsconfig.json字段include,将路径传递到将存储覆盖的文件夹(有关更多详细信息,请参阅此答案)。

然后你可以有一个.d.ts像这样的文件:

declare module "third/party/module" {
  class SomeApi {
    async getData(signal: AbortController | null): unknown;
  }
  const apiInstance: SomeApi;
  export default apiInstance;
}
Run Code Online (Sandbox Code Playgroud)