【问题标题】:Readonly properties with multiple 'constructors' in TypeScriptTypeScript 中具有多个“构造函数”的只读属性
【发布时间】:2017-04-19 20:35:13
【问题描述】:

我在 Typescript 中遇到了一个问题,我找不到优雅的解决方案...

我想使用只读属性,但它们似乎与多个“构造函数”不兼容。

我正在使用多个构造函数,因为我的对象可以直接创建,也可以从 JSON 存储中实例化。我还想控制创建 API(例如,在第一次创建时创建 UUID)。

我的基类看起来像:

class UserEvent {
    protected constructor(
        readonly uuid: string,
        readonly creationDate: Date,
    ) {}

    static create() {
        return new this(uuid(), new Date());
    }

    static fromJSON(jsonTree) {
        return new this(jsonTree.uuid, jsonTree.creationDate);
    }
    toJSON(): any {
        return {
            uuid: this.uuid, 
            creationDate: this.creationDate.toJSON(),
        }
    }
}

然后我想继承它并添加一些属性-

class OrderedPizzaEvent extends UserEvent {
    private constructor(
        uuid: string,
        creationDate: Date,
        readonly pizzaFlavour: string,
        readonly pizzaSize: number,
    ) {
        super(uuid, creationDate);
    }

    static create(options: {pizzaFlavour: string, pizzaSize: number}) {
        const instance = super.create();
        instance.pizzaFlavour = options.pizzaFlavour;
        instance.pizzaSize = options.pizzaSize;
        return instance;
    }

    static fromJSON(jsonTree) {
        const instance = super.fromJSON(jsonTree);
        instance.pizzaFlavour = jsonTree.pizzaFlavour;
        instance.pizzaSize = jsonTree.pizzaSize;
        return instance;
    }
    toJSON() {
        const result = super.toJSON();
        result.pizzaFlavour = this.pizzaFlavour;
        result.pizzaSize = this.pizzaSize;
        return result;
    }
}

这不起作用,因为只读属性未设置构造函数。但是在使用create()fromJSON() 的超级实现时,我无法使用正确的参数调用构造函数。

还有其他方法可以做到这一点吗?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    这可行,但它不是很漂亮/干净:

    class UserEvent {
        protected constructor(
            readonly uuid: string,
            readonly creationDate: Date,
        ) {}
    
        static create() {
            return new this("KEY", new Date());
        }
    
        static fromJSON(jsonTree) {
            return new this(jsonTree.uuid, jsonTree.creationDate);
        }
        toJSON(): any {
            return {
                uuid: this.uuid, 
                creationDate: this.creationDate.toJSON(),
            }
        }
    }
    
    class OrderedPizzaEvent extends UserEvent {
        private constructor(
            uuid: string,
            creationDate: Date,
            readonly pizzaFlavour: string,
            readonly pizzaSize: number,
        ) {
            super(uuid, creationDate);
        }
    
        static createOrderedPizzaEvent(options: { pizzaFlavour: string, pizzaSize: number }) {
            return this.createInstance(super.create(), options);
        }
    
        private static createInstance(temp: UserEvent, options: { pizzaFlavour: string, pizzaSize: number }) {
            return new this(temp.uuid,
                temp.creationDate,
                options.pizzaFlavour,
                options.pizzaSize);
        }
    
        static fromJSON(jsonTree) {
            const instance = super.fromJSON(jsonTree) as OrderedPizzaEvent;
            return this.createInstance(instance, instance);
        }
    
        toJSON() {
            const result = super.toJSON();
            result.pizzaFlavour = this.pizzaFlavour;
            result.pizzaSize = this.pizzaSize;
            return result;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多