Как использовать ImmutableJS Map с TypeScript - PullRequest
0 голосов
/ 15 октября 2018

У меня есть древовидная структура, которая выглядит примерно так:

interface TreeData {
  id : number;
  text : string;
  children : TreeData[];
}

Я хочу обернуть это в неизменяемую карту, но так как я использую TypeScript, я хотел бы использовать некоторую безопасность типов при использовании getи установить.Я нашел в Интернете 2 статьи с предложениями о том, как можно это сделать, см.

https://github.com/facebook/immutable-js/issues/683 https://blog.mayflower.de/6630-typescript-redux-immutablejs.html

Однако моя проблема состоит в том, что мои TreeData содержат списокTreeData детей.Если я определю свой ImmutableMap следующим образом:

export interface ImmutableMap<T, K, V> extends Map<K, V> {
  get<I extends keyof T>( key : I & K ) : T[I] & V;
  set<S extends keyof T>( key : S & K, value : T[S] & V ) : Map<K, V>;
}

Затем, когда я пытаюсь определить следующее, я получаю сообщение об ошибке машинописного текста:

type ImmutableTreeData = ImmutableMap<TreeData, string, string | List<ImmutableTreeData>>;

[TS] Псевдоним типа ImmutableTreeData циклически ссылаетсясам

Как я могу исправить эту ошибку TypeScript?

1 Ответ

0 голосов
/ 16 октября 2018

Как насчет записи?

interface ITreeData {
  id: number;
  text: string;
  chilren?: ITreeData;
}

const defaultTreeData: ITreeData = {
  id: 0,
  text: "",
  chilren: undefined
};

class TreeData extends Record(defaultTreeData) {
  public static Init() {
    return new TreeData(defaultTreeData);
  }
}

const treeData = TreeData.Init().set("text", "ok");

const treeData2 = treeData.set("chilren", treeData);

console.log(treeData2);
...