type Omit<T, K> = Pick<T, Exclude<keyof T, K>>
class Chain<T = number> {
fun1() {
return this as Omit<this, 'fun1'>
}
fun2(arg: T) {
return this as Omit<this, 'fun2'>
}
fun3() {
return this as unknown as Chain<string>
}
}
// case1
new Chain()
.fun1()
.fun1() // it's ok
// case2
new Chain()
.fun3()
.fun2('')
.fun1()
.fun2(1) // it'ok
// case3
new Chain()
.fun1()
.fun2(1)
.fun1() // expect a compiler error
从上面的代码可以看出,打字稿可以“记住”链调用的泛型更改,但“无法记住”方法的更改。
那么,如何使case3也可以?
答案 0 :(得分:1)
@aweiu如果您接受它们看起来多么丑陋,那么可能会发生很多事情:D
我使用了explicit this参数,使其通用,并限制为Partial<Chain<T>>
。