如何为 Js promises 添加 Typescript 接口?

How to add Typescript interface for Js promises?

我是 TypeScript 的新手,正在尝试将 Promises 类型设置为以下代码

Promise<any> 的类型提供给 promise 变量仍然为 .resolve 提供波浪红色, .reject.promise

const wrappedPromise = function() {
  var wrappedPromise = {},
    promise = new Promise(function(resolve, reject) {
      wrappedPromise.resolve = resolve;
      wrappedPromise.reject = reject;
    });
  wrappedPromise.then = promise.then.bind(promise);
  wrappedPromise.catch = promise.catch.bind(promise);
  wrappedPromise.promise = promise;
  return wrappedPromise;
};

此外,泛型 的使用在这里有意义吗?如果是,那又如何?

does use of generics make sense here

是的,但是您还需要一个用于包装承诺的接口类型。 (好吧,您 不需要 它,但它会让生活变得更简单)。让我们从那个开始:

interface WrappedPromise<T> extends Promise<T> {
    resolve(v: T): void;
    reject(e: Error): void;
    promise: Promise<T>;
}

您可能想在这里或那里调整一些东西,但是例如,由于您不知道 then 处理程序可能会将通过它的 fulfillment 转换成什么,Promise<any>then 的 return 类型。

然后这是一个为你的函数分配类型参数的问题,并且可能在 wrappedPromise 上使用 Partial 包装器,因为它最初不具有 WrappedPromise 需要的所有属性(并且这意味着一旦我们知道它具有所有部分,我们就需要在最后使用类型断言):

const wrappedPromise = function<T>(): WrappedPromise<T> {
  var wrappedPromise: Partial<WrappedPromise<T>> = {},
    promise = new Promise<T>(function(resolve, reject) {
      wrappedPromise.resolve = resolve;
      wrappedPromise.reject = reject;
    });
  wrappedPromise.then = promise.then.bind(promise);
  wrappedPromise.catch = promise.catch.bind(promise);
  wrappedPromise.promise = promise;
  return wrappedPromise as WrappedPromise<T>;
};

同样,您可能需要调整一些,但您明白了。

Live on the playground

您需要仔细查看 TypeScript 对 Promise 的定义,看看是否还有更多您想要做的...