【问题标题】:Create subclasses with different attributes using an ImmutableJS Record使用 ImmutableJS 记录创建具有不同属性的子类
【发布时间】:2016-10-01 03:25:33
【问题描述】:

我们使用 ES6 和 immutable.js 来创建不可变的类。

class Animal extends Record({foo: ""});

如何从 Animal 继承并添加自定义属性,但仍能将其用作不可变的 Record

class Animal extends Animal {}; // How to add the key "bar"?

【问题讨论】:

标签: javascript ecmascript-6 immutable.js


【解决方案1】:

Record 方法将创建的类型锁定为defaultValues,并且不能用于进一步扩展属性。这是我提到的抱怨之一here

如果您不太热衷于在运行时检查继承 (instanceof),那么您可以这样做 -

let foo = {foo: ""};
class Animal extends Immutable.Record(foo){}
let bar = {bar: ""};
class Mammals extends Immutable.Record(Object.assign({}, foo, bar)){}

虽然不能替代真正的继承,但它可以让您稍微重用模式。方法不会以这种方式继承。

【讨论】:

    【解决方案2】:

    我们可以在这里使用 mixins。

    
    
        const PersonMixin = Base => class extends Base {
            grew(years) {
                return this.set("age", this.age + years);  //returns a new Person, which is fine
            }
        };
    
        const PersonBase = PersonMixin(new Immutable.Record({name: null, age: null}));
        class Person extends PersonBase {}
    
        const AcademicanBase = PersonMixin(new Immutable.Record({name: null, age: null, title: null}));
        class Academician extends AcademicanBase {
            constructor({name, age, title}) {
                super({name, age, title});
            }
        }
    
        var a = new Academician({name: "Bob", age: 50, title: "Assoc. Prof"});
        console.log(a);
        console.log(a.grew(10).age); //grew works
        a.title = "Prof";   //the error "Cannot set on an immutable record" received.
    
    

    【讨论】:

      【解决方案3】:

      我已经完成了这个,希望它对某些人有所帮助。

      // @flow
      import type {RecordFactory, RecordOf} from "immutable";
      import {Record} from "immutable";
      
      type OneProps = {|
          key: boolean
      |};
      const oneDefaults: OneProps = {
          key: false
      };
      type One = RecordOf<OneProps>;
      const oneItemBuilder: RecordFactory<OneProps> = Record(oneDefaults);
      
      type TwoProps = {|
          ...OneProps,
          moreKeys: string
      |};
      const twoDefaults: TwoProps = {
          ...oneDefaults,
          moreKeys: "more"
      };
      type Two = RecordOf<TwoProps>;
      const twoItemBuilder: RecordFactory<TwoProps> = Record(twoDefaults);
      
      const oneItem: One = oneItemBuilder();
      const twoItem: Two = twoItemBuilder({moreKeys: "more keys"});
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 2018-12-31
        • 2021-12-15
        • 1970-01-01
        • 2022-08-19
        • 1970-01-01
        • 2023-02-14
        相关资源
        最近更新 更多