【问题标题】:How can I create an inline abstract class in TypeScript?如何在 TypeScript 中创建内联抽象类?
【发布时间】:2022-01-02 16:07:06
【问题描述】:

这是我面临的错误:

src/Model.ts:11:16 - error TS2797: A mixin class that extends from a type variable containing an abstract construct signature must also be declared 'abstract'.

11   return class Foo2 extends Base {
                  ~~~~

这是代码:

abstract class ModelBase {
  bar() {
    console.log("bar")
  }
}

type GConstructor<T = {}> = abstract new (...args: any[]) => T;
type Foo = GConstructor<ModelBase>

function Foo2<TBase extends Foo>(Base: TBase) {
  return class Foo2 extends Base {
    foo() {
      console.log(this.bar())
    }
  }
}

export const Model = Foo2(ModelBase)

如果我在 return 语句中添加abstract,如下所示:

  return abstract class Foo2 extends Base {

我得到错误:

src/Model.ts:11:19 - error TS1005: ';' expected.

11   return abstract class Foo2 extends Base {
                     ~~~~~

那么,我怎样才能做到这一点呢?本质上是向一个抽象类添加一个 mixin,从而产生另一个抽象类。

【问题讨论】:

  • 不能返回抽象类,因为抽象类是 TypeScript,因此在运行时不存在。
  • 我想这可能是an XY problem。请直接描述您的要求。
  • 抽象类的重点是不能直接构造
  • @captain-yossarian 他不想实例化它,他只想在保留抽象性的同时扩展它。对我来说似乎是一个合法的要求????‍♂️
  • @TitianCernicova-Dragomir 当然,你是对的,我没有仔细阅读这个问题。你的答案看起来不错!

标签: typescript abstract-class mixins


【解决方案1】:

您可以使用类声明 abstract 不支持类表达式

abstract class ModelBase {
  bar() {
    console.log("bar")
  }
  abstract abstr(): void
}

type GConstructor<T = {}> = abstract new (...args: any[]) => T;
type Foo = GConstructor<ModelBase>

export function Foo2<TBase extends Foo>(Base: TBase) {
  abstract class Foo2 extends Base {
    foo() {
      console.log(this.bar())
    }
  }
  return Foo2
}

export const Model = Foo2(ModelBase)

class X extends Model {
    abstr(): void {
    }
    constructor() {
        super();
    }
}



Playground Link

注意:如果您使用它,我认为您可能会遇到声明发出问题。操场似乎为此生成了一些不好的类型 (Model: (abstract new (...args: any[]) /*...*/)。如果您使用声明发出,您可能需要更明确的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 2012-05-11
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多