排除使用的方法

时间:2019-03-04 20:08:18

标签: typescript

在流利的api中使用方法时,是否可以从类型中排除方法?例如: 我们有带有逐步方法的设置类。

class Setup{
step1(){ return this;}
step2(){ return this;}
step3(){ return this;}
}
let setup = new Setup();

现在我想要实现的目标。 首先,我将使用的显然是第一步,因此: setup.step1()。 //在一个点之后,我仍然可以再次选择step1,但是我想阻止它,正如我之前所说的,我如何排除step1以仅保留step2和step3

2 个答案:

答案 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 Setupself的方法

答案 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 [编辑]