延迟扩展 Promise

Dom*_*kis 1 promise deferred typescript

如何实现扩展 Promise 的 Deferred 承诺?在需要典型 Promise 的情况下,为类型安全使用扩展 Promise 很重要。

实施后

export class Deferred<T> extends Promise<T> {                                   
  public _resolveSelf;
  public _rejectSelf;                                                           
  constructor() {
    super(
      (resolve, reject) =>
      {
        this._resolveSelf = resolve
        this._rejectSelf = reject
      }
    )
  }                                                                             
  public resolve(val:T) { this._resolveSelf(val) }
  public reject(reason:any) { this._rejectSelf(reason) }                        
}
Run Code Online (Sandbox Code Playgroud)

抛出TypeError: _this is undefined

这个 Typescript playground 中,可以看到编译后的 javascript 很有趣。在第 15 行,在声明过程中_this已经分配了它的属性。

Dom*_*kis 5

export class Deferred<T> implements Promise<T> {

  private _resolveSelf;
  private _rejectSelf;
  private promise: Promise<T>

  constructor() {
    this.promise = new Promise( (resolve, reject) =>
      {
        this._resolveSelf = resolve
        this._rejectSelf = reject

      }
    )
  }

  public then<TResult1 = T, TResult2 = never>(
    onfulfilled?: ((value: T) =>
      TResult1 | PromiseLike<TResult1>) | undefined | null,
    onrejected?: ((reason: any) =>
      TResult2 | PromiseLike<TResult2>) | undefined | null
    ): Promise<TResult1 | TResult2> {
      return this.promise.then(onfulfilled, onrejected)
    }

  public catch<TResult = never>(
    onrejected?: ((reason: any) =>
      TResult | PromiseLike<TResult>) | undefined | null
    ): Promise<T | TResult> {
      return this.promise.then(onrejected)
    }

  public resolve(val:T) { this._resolveSelf(val) }
  public reject(reason:any) { this._rejectSelf(reason) }

  [Symbol.toStringTag]: 'Promise'

}
Run Code Online (Sandbox Code Playgroud)

方法签名thencatchTypescript 的 Promise 接口复制粘贴并进行了外观清理。该[Symbol.toStringTag]行也是 Typescript 将其视为 Promise 所必需的,尽管您只能从编译器中发现这一点。