如何将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
,它对任何函数都不起作用。一定有更好的解决办法,但我找不到。