构建一个类数组,以使用TypeScript中的重载构造函数执行静态方法

构建一个类数组,以使用TypeScript中的重载构造函数执行静态方法,typescript,Typescript,以下代码在TypeScript中不正确。编译器不喜欢数组的类型。“类型'typeof FolderDetailMainComponent'不能分配给类型'typeof BaseDetailComponent'”。如果子类没有使用新参数重载构造函数,那么它确实可以工作。类型“Array”似乎是执行静态方法“say”所必需的 导出类BaseDetailComponent{ 构造函数(){} 静态say(){} } 导出类FolderDetailMainComponent扩展了BaseDetailCo

以下代码在TypeScript中不正确。编译器不喜欢数组的类型。“类型'typeof FolderDetailMainComponent'不能分配给类型'typeof BaseDetailComponent'”。如果子类没有使用新参数重载构造函数,那么它确实可以工作。类型“Array”似乎是执行静态方法“say”所必需的

导出类BaseDetailComponent{
构造函数(){}
静态say(){}
}
导出类FolderDetailMainComponent扩展了BaseDetailComponent{
构造函数(私有myIncjet:string){//p.say())

我能想到的唯一方法(编辑:幸运的是,不过)是使用您希望从构造函数使用的静态方法定义一个接口:

interface Sayable {
    say(): void;
}
然后使用该界面:

const example : Sayable[] = [ FolderDetailMainComponent];

const示例:数组=[FolderDetailMainComponent];


这是因为TypeScript的类型兼容性是结构化的(如果它有正确的内容,则匹配),而不是标称的(如果它有正确的名称/沿袭则匹配)。

所以问题是构造函数可调用/可更新签名。省略它的一种方法(我可以想到)是使用映射类型(因为它们映射到已知属性,并且不携带可调用签名):

type ExcludeCallable={[K in keyof T]:T[K]};
常量示例:数组=[FolderDetailMainComponent];

我更喜欢这种解决方案,因为它可以在静态系统上使用接口methods@brenkdar-对不起,我不明白第二部分…?看起来TS不支持这样的东西:类FolderDetailMainComponent实现Sayable{static say(){..}@brenkdar-啊,我明白你的意思。如果你编辑
FolderDetailMainComponent
并删除
say
(你还必须编辑
BaseDetailComponent
才能删除
say
,否则
FolderDetailMainComponent
会继承它),那么你就会得到一个编译器错误。但是,如果您这样做了,那么对数组的分配将成为一个错误,因此您仍然会收到问题的主动通知。我可以看到我需要上面的接口解决方案的情况,但是对于您在问题中描述的情况,我想我会使用Aleksey的解决方案。
const example : Sayable[] = [ FolderDetailMainComponent];
const example : Array<Sayable> = [ FolderDetailMainComponent];
type ExcludeCallable<T> = { [K in keyof T]: T[K] };

const example: Array<ExcludeCallable<typeof BaseDetailComponent>> = [FolderDetailMainComponent];