javascript - 如何在 ImmutableJS Record 的扩展类上使用 setter

标签 javascript overriding setter extends immutable.js

我想使用不可变来实现我的域模型。因此,我进行了查看和搜索,发现了一个基于记录扩展的常用模式。 我遇到的唯一问题是:我无法让 .set.merge 函数正常工作。

让我们使用以下示例:

const SpecificRecord = Record({id: 0, someProp: ''});

export default class SpecificClass extends SpecificRecord {

  id: number;
  someProp: string;

  constructor(id, someProp) {
    super({id, someProp});
  } 

  isSomePropFancy = () : boolean => {
    return this.someProp === 'fancy';
  }
}

到目前为止一切顺利。当尝试操作记录时,问题就开始了:

const obj: SpecificClass = new SpecificClass(1, 'not-fancy');
console.log(obj.isFancy()); //prints out false
const newObj = obj.set('someProp', 'fancy'); //returns a Record -> should be SpecificClass
console.log(newObj.someProp) //prints out 'fancy'
console.log(newObj.isFancy()); //this fails: isFancy is not a function

我的问题是:我们如何覆盖或任何解决方案来让我们更新记录的扩展,同时保留正确的类及其所有方法?

非正式:现在我使用这个,但我真的非常非常不满意这个解决方案:

//In SpecificClass I override:
set = (key, value): SpecificClass => {
  const values = super.toObject();
  values[key] = value;
  return new SpecificClass(values);
};

最佳答案

对于箭头函数的通常建议是“当有疑问时,使用它”。在这种情况下,它打破了工厂的记录。只需将其更改为常规函数即可:

const SpecificRecord = Record({id: 0, someProp: ''});
class SpecificClass extends Immutable.Record({id: 0, someProp: ''}) {
  constructor(id, someProp) {
    super({id, someProp});
  } 

  /* bad
  isFancy = () => {
    return this.someProp === 'fancy';
  }
  */

  // good
  isFancy() {
    return this.someProp === 'fancy';
  }
}

const obj = new SpecificClass(1, 'not-fancy');
console.log('fancy:', obj.isFancy()); //prints out false
const newObj = obj.set('someProp', 'fancy'); //returns a Record -> should be SpecificClass
console.log('new obj prop:', newObj.someProp) //prints out 'fancy'
console.log('is new obj fancy?', newObj.isFancy());

关于javascript - 如何在 ImmutableJS Record 的扩展类上使用 setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56545921/

相关文章:

c++ - 在头文件中实现 getter 和 setter

c++ - 在 set 方法中传递 get 方法

javascript - 如何使用 Angular JS 检查任何列值的 json 数据是否存在数组/集合?

javascript - removeAt() 函数是否应该删除删除节点的指针?

javascript - 如何从 glimmer 组件中获取父上下文?

java - Java中的方法重写-将子类对象分配给父类变量

javascript - 使 Ideone API 在 Codeigniter 上工作(ajax、javascript、soapclient)

css - 用@import 覆盖 css 样式不起作用

java - Java中重写进程KeyEvent

objective-c - "LValue"不是我想的意思吗?