web-dev-qa-db-ja.com

型付きES6クラスでImmutableJSを使用するにはどうすればよいですか?

クラスTaskTaskGroupがあるとします。

_class Task{
     constructor(public text:string){}
}

class TaskGroup {
    constructor(public title:string = "new task group", public tasks:Task[] = []){}
}
_

次に、私のAngular 2サービスで、タスクグループの不変リストを作成します

_@Injectable()
class TaskService {
    taskGroups:Immutable.List<TaskGroup>;

    constructor() {
       this.taskGroups = Immutable.List<TaskGroup>([new TaskGroup("Coding tasks")]);
    }
}
_

このように、taskGroupsリストのみが不変です。中にあるものは何でもありません。 Immutable.fromJS(...)の代わりにImmutable.List<Board>(...)を実行しても、ネストされたオブジェクトは単純な古いJavascriptオブジェクトです。

不変JSはクラス継承を想定していません( ES6#562を使用した不変オブジェクトからの継承

_//can't do this!
class TaskGroup extends Immutable.Map<string, any>{
    constructor(public title:string = "new task group", public tasks:Task[]){}
}
//it complained about the class not having methods like set, delete etc
_

では、不変クラスオブジェクトを作成する方法は?

15
Frozen Crayon

あなたはこのようにすることができます:

const TodoRecord = Immutable.Record({
    id: 0,
    description: "",
    completed: false
});

class Todo extends TodoRecord {
    id:number;
    description:string;
    completed: boolean;

    constructor(props) {
        super(props);
    }
}

let todo:Todo = new Todo({id: 1, description: "I'm Type Safe!"});

完璧ではありませんが、機能しています。

それはこの素晴らしいブログ投稿から来ています: https://blog.angular-university.io/angular-2-application-architecture-building-flux-like-apps-using-redux-and-immutable-js- js /

9
bertrandg

this チュートリアルで説明されているように、Immutableを使用してラッパーを作成できます。

import { List, Map } from 'immutable';

export class TodoItem {
  _data: Map<string, any>;

  get text() {
    return <string> this._data.get('text');
  }

  setText(value: string) {
    return new TodoItem(this._data.set('text', value));
  }

  get completed() {
    return <boolean> this._data.get('completed');
  }

  setCompleted(value: boolean) {
    return new TodoItem(this._data.set('completed', value));
  }

  constructor(data: any = undefined) {
    data = data || { text: '', completed: false, uuid: uuid.v4() };
    this._data = Map<string, any>(data);
  }
}

これがお役に立てば幸いです。 ;)

3
Kutyel