Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 不是另一个TS2511:无法创建抽象类的实例_Typescript - Fatal编程技术网

Typescript 不是另一个TS2511:无法创建抽象类的实例

Typescript 不是另一个TS2511:无法创建抽象类的实例,typescript,Typescript,我的问题与这个问题非常接近,但也略有不同。如果它真的是一个复制品,我想要一个合理的解释,至少因为我不知道如何解决这个问题 我有一个基类: export abstract class MyBaseClass { private thing: Thing; constructor(thing: Thing) { this.thing = thing; } } export type MyBaseClassType = typeof MyBaseClass; expo

我的问题与这个问题非常接近,但也略有不同。如果它真的是一个复制品,我想要一个合理的解释,至少因为我不知道如何解决这个问题

我有一个基类:

export abstract class MyBaseClass {
   private thing: Thing;

   constructor(thing: Thing) {
      this.thing = thing;
   }
}

export type MyBaseClassType = typeof MyBaseClass;
export interface IMyBaseClass extends MyBaseClassType {};
问题是
MyBaseClass
是我正在发布的库的一部分。该库的用户将基于
MyBaseClass
构建一个类,然后该库将成为一个可运行的解决方案。他们只需简单地说一下就可以运行他们的代码:

node our-provided-bin run -b /path/to/client-class-extending-base-class
在这个脚本中,我们做了一个

const ImportedClassRef: IMyBaseClass = require(resolvedPath);
ImportedClassRef
通过一些方法传递,我们最后说

const dude = new ImportedClassRef(thing);

我有点害怕:
TS2511:无法创建抽象类的实例。

在以
ImportedClassRef
为参数的类中,我定义了如下支柱:

interface IProps {
   ...
   ImportedClassRef: MyBaseClass | any;
}

export SomeRunnerClass {
    private dude: MyBaseClass;

    constructor({..., ImportedClassRef}:IProps) {
        ...
        this.dude = new ImportedClassRef(thing);
    }
}

|any
消除了错误,但不是“修复”。请参见
半安全
的注释。

接口只是描述结构,而不是新命名的类

interface A {
  arg1: string;
}

interface B {
  arg1: string
}

// A and B are the same
let a: A = {arg1: ""};
let b: B = a;
这就是为什么:

export type MyBaseClassType = typeof MyBaseClass;
export interface IMyBaseClass extends MyBaseClassType {};
完全等同于:

type IMyBaseClass = typeof MyBaseClass;
因此,你的问题与你提到的问题完全相同

我不知道什么类型的
东西
应该是什么类型的,但基于假设它是固定类型,我会这样定义它:

它不可调用,除非从派生类调用。为了避免这种情况,类型
InstantiableClass
定义了一个普通构造函数,它只返回
T extends MyBaseClass
的实例

type InstantiableClass<T extends MyBaseClass> = {
  /* no abstract */ new(thing: Thing): T
}
type InstantiableClass={
/*无摘要*/新(事物:事物):T
}

因此,这种方法之所以有效,是因为我们只是模仿了MyBaseClass的
typeof
结构,不同之处在于定义了一个普通的构造函数而不是抽象的构造函数。

嘿!我让它工作!非常感谢。你可能不知道它为什么会起作用?做了一个更新并解释了。啊好的。。。因此,如果我们想实例化一个抽象类的实例,我们需要为它创建一个普通的构造函数。这更有意义。再次感谢你@米尔科斯。我不明白你的解决办法。如果删除
any
,则会在
const importedClassRef…
处出现错误。若您尝试使用any运行它,在您说“no error”的行中也会出现错误。@semisure行“{}as any”只是扩展基类的实际类的占位符。我已经用一个“RealClass”更新了这个示例,使其更加清晰。Run现在也可以在“this”后面的第一个操场链接上运行。如果你仍然失败,我需要更多的细节,你运行的环境。虽然这是“工作”,它是一个创可贴对我的问题。米尔科得到了答案。非常感谢。这不是解决办法
MyBaseClass | any
=
any
any
意味着完全不打字。我添加了你的评论。我想把这个放在这里,这样尝试过的人就会意识到这也不是一个解决办法。感谢您的评论,@semisecure
type AbstractConstructor = abstract new(...args: any[]) => any;

const AbstractClass: AbstractConstructor = {} as any;

new AbstractClass() // Error: Cannot create an instance of an abstract class
type InstantiableClass<T extends MyBaseClass> = {
  /* no abstract */ new(thing: Thing): T
}