“.d.ts”文件,如何将 Promise 结果声明为函数的结果

".d.ts" Files, how to declare Promise result as result of a Function

我编写了一个小的异步函数来帮助我return将 Promises 结果作为两个元素的数组。

我的职能是

/* will.js */
const will = async (result) => {
  try {
    const result = await funcResult;
    return [null, result];
  }
  catch (err) {
    return [err, null];
  }
}

export default will;

/* any-file.js */
import will from './will';

function someFunction() {
  const [err, data] = await will(someFetch());
  if (err) {
    throw err;
  }
  // ecc. ecc.
}

我正在尝试编写相关 .d.ts 文件。传递给 will 的函数总是 return 一个在不同时间解析的 Promise:有时会在 string 中解析,有时会在 boolean 中解析...在那种情况下它不是很大问题,但是如果我将通过 mongoose 查询执行(例如),我希望 will 函数将 return 一个在 MongooseDocument 中解析的 Promise 以实现代码完成正确。

const [findUserError, user] = await will(User.findOne({ email }).exec());

// From this point i would like
// user variable is `MongooseDocument` type
// as the return value of User.findOne({ email }).exec()
// is `Promise<MongooseDocument>`

我是 .d.ts 文件的新手,我试着简单地写

declare function will(result: Promise<T>): Promise<[any, T]>

export default will

但是显然不行...

有人可以帮助我吗?

谢谢

创建时 generics 需要定义 Generic 键,当使用函数执行此操作时,可以在函数名称之后定义它。在这种情况下 will<T>.

declare function will<T>(result: Promise<T>): Promise<[any, T]>

对于 class 也是如此,例如 MyClass<T>

declare class MyClass<T> {
  myMethod<A>(param: T): Promise<A>
}

当泛型是一个对象并且可以是多种类型时,您可以使用扩展基础对象的扩展。

declare class Base {}
declare class A extends Base {}
declare class B extends Base {}

declare class Handler<T extends Base> {
  addItem(item: T): void
}