在流利的api中使用方法时,是否可以从类型中排除方法?例如: 我们有带有逐步方法的设置类。
class Setup{
step1(){ return this;}
step2(){ return this;}
step3(){ return this;}
}
let setup = new Setup();
现在我想要实现的目标。 首先,我将使用的显然是第一步,因此: setup.step1()。 //在一个点之后,我仍然可以再次选择step1,但是我想阻止它,正如我之前所说的,我如何排除step1以仅保留step2和step3
答案 0 :(得分:3)
您可以使用Omit
排除方法。诀窍是让被省略的方法流经调用。多态性不是一个选项,因为它是在创建类时确定的(不是基于实际的调用目标)。我们可以使用类型参数根据调用目标来推断this
(之所以必须这样做,因为调用目标可能已经排除了方法)
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
class Setup {
step1<T extends Partial<Setup>>(this: T) : Omit<T, 'step1'> { return this; }
step2<T extends Partial<Setup>>(this: T) : Omit<T, 'step2'> { return this; }
step3<T extends Partial<Setup>>(this: T) : Omit<T, 'step3'> { return this; }
}
let setup = new Setup();
setup.step1().step2().step3()
setup.step1().step2().step2() //err
此外,由于this
现在可能不包含所有方法,因此我们说T
将扩展Partial<Setup>
。这使类型锻炼成为可能,但是将使this
在函数内部难以使用,因此请考虑使用类似const self = this as Setup
和self
的方法
答案 1 :(得分:0)
我想我接近了。首先让我们定义Omit util export type Omit<A extends object, K extends string> = Pick<A, Exclude<keyof A, K>>
,它将创建一个没有特定字段的新接口。
然后将step1
方法的类型定义从step1(): Setup
更改为step1(): Omit<Setup, 'step1'>
。
在这种情况下,setup1将返回安装实例,而不会提交以下内容:step1
。
不幸的是,您仍然可以这样做:
setup.step1();
setup.step1();
但是当您链接方法时,会收到错误消息
setup
.step1()
.step1(); // ERROR
因为属性'step1'在Omit类型上不存在
Playground [编辑]