首页 > 解决方案 > 在 TypeScript 中,如果方法可以更改该类型,如何指定方法链接结果类型?

问题描述

假设我想实现以下行为:

const x = new ChainableClass<any>();
x.get(); // -> any[] (default)
x.all().get(); // -> any[]
x.single().get(); // -> any
x.all().single().all().get(); // -> any

方法改变value(它可以是任何类型)并返回this以继续链。
get返回单个 value数组values。_

以下是我尝试实现此类的方式:

export class ChainableClass<TEntity, TResult = TEntity[]> {
  private value: any; // arbitrary value
  
  all(): ChainableClass<TEntity, TResult> {
    // TODO implementation
    return this;
  }

  // notice I change second type to TEntity (it's TEntity[] by default)
  single(): ChainableClass<TEntity, TEntity> { 
    // TODO implementation
    return this; // TS2322 error here
  }

  anotherAll(): ChainableClass<TEntity, TResult> {
    // TODO implementation
    return this;
  }

  get(): TResult {
    return this.value;
  }
}

TResult但是,如果我在single方法中进行更改,TypeScript 会发出错误。

src/ChainableClass.ts:9:5 - error TS2322: Type 'this' is not assignable to type 'ChainableClass<TEntity, TEntity>'.
  Type 'ChainableClass<TEntity, TResult>' is not assignable to type 'ChainableClass<TEntity, TEntity>'.
    Type 'TResult' is not assignable to type 'TEntity'.
      'TEntity' could be instantiated with an arbitrary type which could be unrelated to 'TResult'.

9     return this;
      ~~~~~~~~~~~~

this我可以通过强制转换来压制它,any但我觉得我在这里错过了一些重要的东西。
我的实现从根本上不正确吗?
实现描述的类类型安全的可能方法是什么?

编辑:只有当我get在课堂上有方法时才会发生错误。

标签: typescriptgenericsmethod-chaining

解决方案


推荐阅读