TypeScript方法链接-返回此值-但仅部分返回

iyfjxgzm  于 2023-02-25  发布在  TypeScript
关注(0)|答案(1)|浏览(130)

如果我想做简单的链接

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
   }
gz5pxeao

gz5pxeao1#

接口对调用者来说是最重要的,实现可能总是提供额外的字段或方法,这些字段或方法没有在返回类型中声明,这是基本的结构化子类型--但是调用者会知道或关心,自动完成和类型检查将只使用声明的返回类型。
因此,使用return this;作为实现完全可以,但前提是JavaScript代码使用该库(那不是类型检查)你可以调用那些额外的方法。如果你真的想确保遵循builder模式并且你在每一步都有不同的合适的方法,对fluent接口使用不同的类--也许你会想要创建带有不可变字段的新示例。工厂函数模式可能比class声明更适合这种方法。

相关问题