typescript - 在 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
在课堂上有方法时才会发生错误。