【发布时间】:2018-10-15 20:28:03
【问题描述】:
我有一个看起来像这样的树结构:
interface TreeData {
id : number;
text : string;
children : TreeData[];
}
我想将它封装到一个不可变映射中,但由于我使用的是 TypeScript,所以我希望在使用 get 和 set 时有一些类型安全性。我在网上找到了 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 错误?
【问题讨论】:
-
在名为
ImmutableMap的类上没有set操作是否违反直觉? -
ImmutableJs 的 Map.set 函数返回一个新的 Map。见facebook.github.io/immutable-js/docs/#/Map/set
-
对不起,我不是故意的,我认为你错了。我只是觉得这个名字很奇怪。
标签: typescript dictionary immutability circular-reference