typescript - 如何将 Typescript 类对象转换为 Immutable.js 映射

标签 typescript immutable.js

我正在尝试将 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/

相关文章:

javascript - 如何在 Immutable.Map({}) 中更改 ImmutableList({}) 中项目的属性

javascript - 在 Redux 中切换到 Immutable.js。对性能有何影响以及对组件语法有何影响?

typescript - 从 firebase 函数获取 NODE_ENV

javascript - 如何在 ionic 3 中使用 cordova 插件蓝牙?

javascript - 从 .ts 编写的简单 Angular2 应用程序调用/加载 .js 类和函数时遇到问题

javascript - 如何将对象属性设置在不同的地方?

javascript - 为什么 2 个 immutable.js 列表有很大不同?

reactjs - 接受 TextArea 和 Input 的 onChange 的 Typescript 和 React 组件

javascript - 如何将 Immutable.js 与 ES6 类一起使用?

javascript - getIn() 在 Immutable.js 中做了什么?