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
}