问题描述
假设我要实现以下行为:
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
来抑制它,但是我觉得我错过了一些重要的事情。
我的实现从根本上来说是错误的吗?
实现所描述的类类型安全的可能方法是什么?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)