带有默认属性值的Typescript混合(从新MyClass派生)

带有默认属性值的Typescript混合(从新MyClass派生),typescript,mixins,Typescript,Mixins,我正在用Typescript进行一些mixin的实验,并且已经掌握了一些构建mixin的不同方法的基础知识。所有这些我都犯了同样的错误 这是我的混音课: export class OnDestroyMixin implements OnDestroy { public destroyStream: Subject<void> = new Subject(); ngOnDestroy(): void { console.log(`on destroy

我正在用Typescript进行一些mixin的实验,并且已经掌握了一些构建mixin的不同方法的基础知识。所有这些我都犯了同样的错误

这是我的混音课:

export class OnDestroyMixin implements OnDestroy {

    public destroyStream: Subject<void> = new Subject();

    ngOnDestroy(): void {
        console.log(`on destroy from mixin`);

        this.destroyStream.next();
        this.destroyStream.complete();
    }
}

我从网上的某个地方复制了它,但正如我所说,我尝试了几种不同的方法,基本上都是将属性从一个原型复制到另一个原型。

这个问题的根本原因是,当您在类上定义一个属性值时,它被传输到JavaScript。上面的mixin代码专门忽略构造函数。这里真正的解决方案是将两个类构造函数合并在一起

在Typescript中似乎有两种不同的混合方法。方法类似于我问题中的方法,我们迭代原型属性,并将它们从一个类复制到另一个类,我们只是:


这个问题的根本原因是,当您在类上定义属性值时,该属性值被传输到JavaScript。上面的mixin代码专门忽略构造函数。这里真正的解决方案是将两个类构造函数合并在一起

在Typescript中似乎有两种不同的混合方法。方法类似于我问题中的方法,我们迭代原型属性,并将它们从一个类复制到另一个类,我们只是:


正如我在前面的回答中提到的,问题是属性的值是在mixin类的构造函数中设置的,而该构造函数在mixin decorator中被忽略

另一种解决方法是不在构造函数中设置属性值,而是使用getter和setter定义属性:

export class OnDestroyMixin implements OnDestroy {
    private _destroyStream: Subject<boolean>;

    public get destroyStream(): Subject<boolean>{
        let stream = this._destroyStream;

        if(stream == null){
            stream = new Subject<boolean>();
            this._destroyStream = stream;
        }

        return stream;
    }


    public ngOnDestroy(): void {
        this.destroyStream.next();
        this.destroyStream.complete();
    }
}
导出类OnDestroyMixin实现OnDestroy{
私人(u):主题;;
public-get-stream():主题{
让stream=这个;
if(流==null){
流=新主题();
这个。_destrostream=流;
}
回流;
}
公共Ngondestory():void{
this.destroy.next();
this.destroy.complete();
}
}

实际上,在这种情况下,不需要setter,因为只读值很有用。当我们使用getter时,这不是一个普通属性,也不是在构造函数中设置的。而是用getter函数定义一个属性。这是在mixin decorator中复制的。

正如我在前面的回答中提到的,问题是该属性的值在mixin类的构造函数中设置,而该构造函数在mixin decorator中被忽略

另一种解决方法是不在构造函数中设置属性值,而是使用getter和setter定义属性:

export class OnDestroyMixin implements OnDestroy {
    private _destroyStream: Subject<boolean>;

    public get destroyStream(): Subject<boolean>{
        let stream = this._destroyStream;

        if(stream == null){
            stream = new Subject<boolean>();
            this._destroyStream = stream;
        }

        return stream;
    }


    public ngOnDestroy(): void {
        this.destroyStream.next();
        this.destroyStream.complete();
    }
}
导出类OnDestroyMixin实现OnDestroy{
私人(u):主题;;
public-get-stream():主题{
让stream=这个;
if(流==null){
流=新主题();
这个。_destrostream=流;
}
回流;
}
公共Ngondestory():void{
this.destroy.next();
this.destroy.complete();
}
}
实际上,在这种情况下,不需要setter,因为只读值很有用。当我们使用getter时,这不是一个普通属性,也不是在构造函数中设置的。而是用getter函数定义一个属性。这是在mixin decorator中复制的

class SourceClass{}

@Component({
    selector: 'some-selector',
    templateUrl: './some-selector.html',
    styleUrls: ['./some-selector.scss']
})
export class SampleMixedClass extends Flies(SourceClass) {}
export class OnDestroyMixin implements OnDestroy {
    private _destroyStream: Subject<boolean>;

    public get destroyStream(): Subject<boolean>{
        let stream = this._destroyStream;

        if(stream == null){
            stream = new Subject<boolean>();
            this._destroyStream = stream;
        }

        return stream;
    }


    public ngOnDestroy(): void {
        this.destroyStream.next();
        this.destroyStream.complete();
    }
}