如果我想做简单的链接
class MyClass {
methodA(): this {
return this
}
methodB(): this {
return this
}
}
new MyClass()
.methodA()
.methodB()
但根据调用函数只返回示例的一部分,如
class MyClass {
methodA(): this {
return this
}
methodB(): Omit<this, "methodA"> { // <- stop calling `methodA` after `methodB` was called
// <- what to return?
}
}
new MyClass()
.methodA()
.methodA()
.methodB()
.methodB()
// .methodA() // <- cannot call `methodA` anymore
- 我该怎么做呢?
当然,我可以
// typescript does not complain about this
methodB(): Omit<this, "methodA"> {
return {
methodB: this.methodB
}
}
// but typescript would not complain about this either, weird
methodB(): Omit<this, "methodA"> {
return this // <- at least it let me do that without throwing
}
但是,如果我想排除单个方法/属性,而不是只包含单个方法/属性,该怎么办?
methodB(): Omit<this, "methodA"> {
const { methodA, ...instance } = this // Could I destructure 'this'? typescript does not complain but eslint throws there would be a parsing error
return instance
}
1条答案
按热度按时间gz5pxeao1#
接口对调用者来说是最重要的,实现可能总是提供额外的字段或方法,这些字段或方法没有在返回类型中声明,这是基本的结构化子类型--但是调用者会知道或关心,自动完成和类型检查将只使用声明的返回类型。
因此,使用
return this;
作为实现完全可以,但前提是JavaScript代码使用该库(那不是类型检查)你可以调用那些额外的方法。如果你真的想确保遵循builder模式并且你在每一步都有不同的合适的方法,对fluent接口使用不同的类--也许你会想要创建带有不可变字段的新示例。工厂函数模式可能比class
声明更适合这种方法。