Mixins除了传统的OO层次结构,另一种从可重用组件构建类的流行方法是通过组合更简单的部分类来构建它们。您可能熟悉Scala等语言中的mixins或traits的概念,并且该模式在JavaScript社区中也很流行。该模式依赖于使用带有类继承的泛型来扩展基类。TypeScript最好的混合支持是通过类表达式模式。看一个例子:classSprite{name="";x=0;y=0;构造函数(名称:字符串){this.name=name;}}typeConstructor=new(...args:any[])=>{};//这个mixin添加了一个scale属性,带有getter和setter//用于使用封装的私有属性更改它:functionScale(Base:TBase){returnclassScalingextendsBase{//Mixins不能声明私有/受保护的属性//然而,你可以使用ES2020私有字段_scale=1;setScale(scale:number){this._scale=scale;}getscale():number{returnthis._scale;}};}constEightBitSprite=Scale(Sprite);constflappySprite=newEightBitSprite("Bird");flappySprite.setScale(0.8);console.log('Ethan:',flappySprite.scale);这个例子和我之前的文章TypeScriptclassesAnexampleofadecorator类似,使用逐步调试来搞清楚它是如何工作的,但是没有decorator语法。使用Scale组装Sprite,并传入ClassSprite的定义:返回一个新的函数,但只要不使用该函数实例化一个新的类实例,函数体就不会执行。现在我们准备使用Scale装饰的Sprite的扩展类来实例化:即将进入mixin内部:先执行基类的字段初始化逻辑:再执行子类字段的初始化逻辑:ConstrainedMixins我们就可以对上面的Mixins做一些改造和增强。在上面的形式中,mixin没有类的基础知识,这可能很难创建你想要的设计。例如,使用上面的mixin,我们可以将_scale属性添加到任何类。如果我们想进一步限制这个,比如限制Scale只能装饰某些类型的Class。为了对此建模,我们修改了原始构造函数类型以接受通用参数。//这是我们之前的构造函数:typeConstructor=new(...args:any[])=>{};//现在我们使用一个通用版本,它可以对//应用此mixin的类应用约束totypeGConstructor=new(...args:any[])=>T;现在,要使用这个类型构造函数,你必须传入一个基类类型作为类型参数:typeSpritable=GConstructor;现在,Scale装饰器只能装饰Sprite及其子类:现在,如果将Sprite及其子类以外的方法传入Scale装饰器,将导致语法错误:AnothermethodimplementedbyObject.definePropertyMixin//每个mixin是一个传统的ES类classJumpable{jump(){}}classDuckable{duck(){}}//包括基类Sprite{x=0;y=0;}//然后你创建一个接口,它合并//预期的mixins与你的baseinterfaceSpriteextendsJumpable,Duckable{}//在运行时通过JSapplyMixins将mixins应用到基类中(Sprite,[Jumpable,Duckable]);letplayer=newSprite();player.jump();console.log(player.x,player.y);//这可以存在于代码库的任何地方:functionapplyMixins(derivedCtor:any,constructors:any[]){constructors.forEach((baseCtor)=>{Object.getOwnPropertyNames(baseCtor.prototype).forEach((name)=>{Object.defineProperty(derivedCtor.prototype,名称,Object.getOwnPropertyDescriptor(baseCtor.prototype,name)||Object.create(null));});});}通过Object.defineProperty将Jumpable和Duckable的属性赋值给Sprite:最终运行效果:接口Sprite,您可以使用Duckable和Jumpable类中定义的方法。更多Jerry原创文章在这里:《王子熙》: