Typescript:泛型不可变集合
Typescript: generic immutable collections
我有以下定义(我使用的是ImmutableJS):
declare module Immutable {
export module Record {
type IRecord<T> = T & TypedMap<T>;
interface TypedMap<T> extends Map<string, any> {
set(key: string, value: any): IRecord<T>
}
interface Factory<T> {
new (): IRecord<T>;
new (values: T): IRecord<T>;
(): IRecord<T>;
(values: T): IRecord<T>;
}
}
export interface Record<T> {
(defaultValues: T, name?: string): Record.Factory<T>;
}
export function Record<T>(
defaultValues: T, name?: string
): Record.Factory<T>;
}
declare interface IState extends Immutable.Map<string, any> {
router: Immutable.Map<string, any>;
sessions: Immutable.Map<gameId, Immutable.List<Immutable.Record<ISession>>>;
games: Immutable.Map<gameId, Immutable.Record<IGame>>
}
当我这样使用它时:
const state: IState = <IState>Map<string, any>({
router: Map<string, any>(),
sessions: Map<gameId, List<Record<ISession>>>({
1: List([10])
}),
games: Map<gameId, Record<IGame>>()
});
我没有任何错误。我想它会抱怨这个部分:
sessions: Map<gameId, List<Record<ISession>>>({
1: List([10])
})
我在List<Record<ISession>>
中添加了数字10
为什么我没有看到任何错误?
这不是一个真正的答案,但它不适合放在评论框中。
@Sohnee,关于你在上面评论中的问题,@popoliani正在从Immutable.js扩展类型,所以这就是Map(以及List和Record)的来源。
我想知道TS 1.7的"this"功能是否与答案相关:多态"this"类型的Typescript PR。我认为Immutable.js的人仍然在思考如何处理Records中的类型安全和继承。见证
- 提出了类型调整,以改进TypeScript代码中Record实例的使用
- 建议:接口扩展泛型类型
在他们思考这一点的同时,我也在思考记录是否值得它们带来的类型安全挑战。
相关文章:
- 如何将不可变的js导入angular 2(alpha)
- JavaScript Array unshift() 以一种不可变的方式
- 将对象从另一个不可变的Map分配给Map是否意味着深度克隆
- 函数在不可变的js和redux存储中
- 如何在JS中创建对象的可变和不可变副本
- 主干.js集合不迭代
- 使用动态键返回不可变状态
- 不可变的JS映射或列表
- 如何使用不可变表示此数组重新排序示例
- 不可变,在映射内更新不返回正确的对象
- 不可变的Chai断言错误,而预期的结果等于
- 使用扩展运算符和析构函数运算符修改不可变对象的最短方法是什么
- 如何在类似Om的不可变应用程序状态下对关系数据进行建模
- javascript中不可变的值
- 不可变的js修改所有嵌套的记录
- WebSQL:SQLResultSetRowList 中的返回行是不可变的
- 如何在不可变/反应文档页面上阅读代码示例
- 在不可变JS中更新列表中的对象
- Typescript:泛型不可变集合
- React internet explorer 11渲染映射到一个不可变集合错误的结果