Node.js TypeScript合并声明组合不';如果目标类被扩展,则无法工作

Node.js TypeScript合并声明组合不';如果目标类被扩展,则无法工作,node.js,typescript,mixins,composition,es6-class,Node.js,Typescript,Mixins,Composition,Es6 Class,我需要使用一个已经扩展的TypeScript类,并与其他一些人一起编写它。我发现这篇文章(以及其他一些类似的文章)展示了一种我认为可以使用的模式: 下面是我的困境的一个例子,使用上面文章中的示例代码作为最小的复制 工作测试ts(原件) //每个mixin都是一个传统的ES类 类跳线{ 跳转(){} } 班级可回避{ duck(){} } //包括基地 雪碧{ x=0; y=0; } //然后创建一个合并的接口 //所需的混音与基本混音同名 接口精灵扩展了可跳转、可躲闪{} //通过将mixin

我需要使用一个已经扩展的TypeScript
,并与其他一些人一起编写它。我发现这篇文章(以及其他一些类似的文章)展示了一种我认为可以使用的模式:

下面是我的困境的一个例子,使用上面文章中的示例代码作为最小的复制

工作测试ts(原件)

//每个mixin都是一个传统的ES类
类跳线{
跳转(){}
}
班级可回避{
duck(){}
}
//包括基地
雪碧{
x=0;
y=0;
}
//然后创建一个合并的接口
//所需的混音与基本混音同名
接口精灵扩展了可跳转、可躲闪{}
//通过将mixin应用到基类中
//运行时的JS
applyMixins(精灵,[可跳,可躲]);
让玩家=新精灵();
player.jump();
console.log(player.x,player.y);
//这可以存在于代码库中的任何位置:
函数applyMixins(DerivedActor:any,构造函数:any[]){
构造函数.forEach((baseCtor)=>{
Object.getOwnPropertyNames(baseCtor.prototype).forEach((名称)=>{
Object.defineProperty(
derivedCtor.prototype,
名称
Object.getOwnPropertyDescriptor(baseCtor.prototype,名称)
);
});
});
}
上面的代码运行正常,但是如果我们添加另一个中间类,比如说
Fairy
,然后让
Sprite
扩展它,我们将遇到一个错误:

断开。测试。ts

//每个mixin都是一个传统的ES类
类跳线{
跳转(){}
}
班级可回避{
duck(){}
}
班仙{
z=“z”
}
//包括基地
类精灵扩展精灵{
x=0;
y=0;
}
//然后创建一个合并的接口
//所需的混音与基本混音同名
接口精灵扩展了可跳转、可躲闪{}
//通过将mixin应用到基类中
//运行时的JS
applyMixins(精灵,[可跳,可躲]);
让玩家=新精灵();
player.jump();
console.log(player.x,player.y);
//这可以存在于代码库中的任何位置:
函数applyMixins(DerivedActor:any,构造函数:any[]){
构造函数.forEach((baseCtor)=>{
Object.getOwnPropertyNames(baseCtor.prototype).forEach((名称)=>{
Object.defineProperty(
derivedCtor.prototype,
名称
Object.getOwnPropertyDescriptor(baseCtor.prototype,名称)
);
});
});
}
这将引发以下错误:

TypeError: Cannot call a class as a function
引发错误的特定行是Sprite类的实例化:

let player=新精灵();
根据我所看到的每一篇关于该错误的帖子,解决方案是使用
new
关键字调用该类。。。但这已经发生了

我很不明白为什么会发生这样的事情,感觉好像TypeScript内部隐藏的东西正在破裂

编辑
事实证明,这些文件只有在我使用Jest运行时才会抛出错误,使用
ts node
或在TypeScript Playworks中运行时才会抛出错误。

问题原来是Jest和我的repo中针对它的配置。我正处于将JS回购转换为打字稿的过程中,因此,JETScript还没有正确地设置成打字稿。< /P> 下面是我如何修复它的:

  • 删除旧的
    jest.config.js
    babel.config.js
    ,并从依赖项中删除(现在)不必要的
    babel
    babel jest
    和其他babel插件
  • ts jest
    @types/jest
    添加到
    devdependency
  • 使用ts jest通过ts jest config:init创建新的jest配置
  • 利润
    我困惑的主要原因是错误消息导致我在
    jest
    GH repo上遇到了一个问题,其中(几乎)所有的解决方案实际上都是针对纯JS的,而我正试图将它们应用到TS上。

    。您的代码中还有其他任何东西可能导致此中断吗?@cherryblossom感谢您尝试重新编程,我可以确认这在操场上确实如预期那样工作。然后我用
    ts node
    在本地运行了我的文件,这同样有效,但是当我用Jest运行这些测试文件时,错误仍然存在,所以这似乎就是问题所在。