如何在运行时更改链接调用的方法?

时间:2019-06-16 05:09:11

标签: typescript

LiveDemo

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也可以?

1 个答案:

答案 0 :(得分:1)

@aweiu如果您接受它们看起来多么丑陋,那么可能会发生很多事情:D 我使用了explicit this参数,使其通用,并限制为Partial<Chain<T>>

这里是TS playground