我正在尝试将 immutable.js 引入 Angular2 项目,但我在将 typescript 类与 immutable.js 结合使用时遇到了问题。
我正在尝试使用 Immutable.fromJS 函数将来自类的可变对象深度转换为不可变对象(immutable对象)。不幸的是,尽管 fromJS 在 json 对象上运行良好,但如果给定了来自某个类的对象,它什么也不做(或者在尝试调用 .toJS() 到生成的对象时抛出)。
class Person {
public firstName: string;
}
let p = new Person();
p.firstName = 'Mike';
console.log(p);
let immutablePersonFail = Immutable.fromJS(p);
console.log(Immutable.Map.isMap(immutablePersonFail)); // returns false
let immutablePersonSuccess = Immutable.fromJS({firstName: 'Nick'});
console.log(Immutable.Map.isMap(immutablePersonSuccess)); // returns true
这是演示问题的 jsbin: https://jsbin.com/yefeha/edit?js,console
最佳答案
试试这个:
let immutablePersonFail = Immutable.fromJS(Object.assign({}, p));
console.log(Immutable.Map.isMap(immutablePersonFail));
更多信息请参见 the other thread我在评论中提到了。
编辑
这是一个选项:
class Base {
toObject(): any {
return Object.assign({}, this);
}
}
class Job extends Base {
public jobTitle: string;
}
class Person extends Base {
public firstName: string;
public jobs: Job[];
toObject(): any {
let obj = super.toObject();
obj.jobs = obj.jobs.map(job => job.toObject());
return obj;
}
}
另一种选择是区分数据和功能:
interface JobData {
title: string;
}
class Job {
private data: JobData;
getTitle(): string {
return this.data.title;
}
getData(): JobData {
return Immutable.fromJS(this.data);
}
}
interface PersonData {
firstName: string;
lastName: string;
jobs: JobData[];
}
class Person {
private data: PersonData;
public jobs: Job[];
getData(): JobData {
return Immutable.fromJS(this.data);
}
}
至于复杂度,我不能说,这取决于你的业务逻辑是什么,以及你如何实现它。
关于typescript - 如何将 Typescript 类对象转换为 Immutable.js 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37301319/