在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方法时,才会发生错误

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)