如何将ImmutableJS映射与TypeScript一起使用

如何将ImmutableJS映射与TypeScript一起使用,typescript,dictionary,immutability,circular-reference,Typescript,Dictionary,Immutability,Circular Reference,我有一个树状结构,看起来像这样: interface TreeData { id : number; text : string; children : TreeData[]; } 我想把它包装成一个不可变的映射,但因为我使用的是TypeScript,所以我希望在使用get和set时有一些类型安全性。我在网上找到了2篇文章,提供了如何做到这一点的建议,请参阅: 然而,我的问题是我的TreeData包含一个TreeData子项列表。如果我这样定义ImmutableMap: exp

我有一个树状结构,看起来像这样:

interface TreeData {
  id : number;
  text : string;
  children : TreeData[];
}
我想把它包装成一个不可变的映射,但因为我使用的是TypeScript,所以我希望在使用get和set时有一些类型安全性。我在网上找到了2篇文章,提供了如何做到这一点的建议,请参阅:

然而,我的问题是我的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>;
}
导出接口不可变映射扩展映射{
get(key:I&K):T[I]&V;
设置(键:S&K,值:T[S]&V):映射;
}
然后,当我尝试定义以下内容时,会收到一条typescript错误消息:

type ImmutableTreeData = ImmutableMap<TreeData, string, string | List<ImmutableTreeData>>;
类型ImmutableTreeData=ImmutableMap;
[TS]类型别名ImmutableTreeData循环引用自身

如何修复此TypeScript错误?

记录如何

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);
从“不可变”导入{Map};
导出接口ITypedMap扩展映射{
get(name:K):T[K];
}
导出函数类型映射(值:T):ITypedMap{
将映射(值)返回为ITypedMap;
}
用法:

const myMap=TypedMap(值);
参考资料:


没有对名为
ImmutableMap
的类执行
set
操作违反直觉?ImmutableJs的Map.set函数返回一个新映射。对不起,我不是故意说我认为你错了。我只是觉得命名很奇怪。我不想使用记录,因为这里提到的原因:我明白你的意思。它们确实削弱了类型安全性。注意:新的打字现在允许使用
recordInstance.user
。如果你需要的话。我用这个来做一个简单的小例子,但是除了
。get
,它对任何函数都不起作用。一定有更好的解决办法,但我找不到。