首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >排除使用的方法

排除使用的方法
EN

Stack Overflow用户
提问于 2019-03-05 04:08:18
回答 2查看 63关注 0票数 0

当我们在fluent api中使用方法时,我们可以从类型中排除它吗?例如:我们有setup类,它有逐步的方法。

代码语言:javascript
复制
class Setup{
step1(){ return this;}
step2(){ return this;}
step3(){ return this;}
}
let setup = new Setup();

现在我想要实现的是。首先,我将使用的显然是step1 so://在点之后,我仍然可以再次选择step1,但我想防止它,正如我前面所说的,如何排除step1以只保留step2和step3

EN

回答 2

Stack Overflow用户

发布于 2019-03-05 04:30:18

您可以使用Omit排除这些方法。诀窍是让省略的方法在调用中流动。多态这不是一个选项,因为它是在创建类时确定的(而不是基于实际的调用目标)。我们可以使用类型参数来根据调用目标推断this (这必须这样做,因为调用目标可能已经排除了方法)

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 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

不幸的是,您仍然可以这样做:

代码语言:javascript
复制
setup.step1();
setup.step1();

但是当你链接方法时,你会收到错误

代码语言:javascript
复制
setup
    .step1()
    .step1(); // ERROR

因为类型Omit上不存在属性“”step1“”

Playground已编辑

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54990778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档