当我们在fluent api中使用方法时,我们可以从类型中排除它吗?例如:我们有setup类,它有逐步的方法。
class Setup{
step1(){ return this;}
step2(){ return this;}
step3(){ return this;}
}
let setup = new Setup();
现在我想要实现的是。首先,我将使用的显然是step1 so://在点之后,我仍然可以再次选择step1,但我想防止它,正如我前面所说的,如何排除step1以只保留step2和step3
发布于 2019-03-05 04:30:18
您可以使用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
发布于 2019-03-05 04:25:16
我想我快到了。首先,让我们定义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将返回没有字段的Setup instance:step1
。
不幸的是,您仍然可以这样做:
setup.step1();
setup.step1();
但是当你链接方法时,你会收到错误
setup
.step1()
.step1(); // ERROR
因为类型Omit上不存在属性“”step1“”
Playground已编辑
https://stackoverflow.com/questions/54990778
复制相似问题