打字稿:通用不可变集合

时间:2015-11-18 15:03:22

标签: javascript typescript immutable.js

我有以下定义(我使用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])
})

我将号码10添加到List<Record<ISession>>

为什么我没有看到任何错误?

1 个答案:

答案 0 :(得分:0)

这不是一个真正的答案,但它不适合评论框。

@Sohnee,关于你上面评论中的问题,@ poliani正在从Immutable.js扩展类型,所以这就是Map(和List,和Record)的来源。

我想知道TS 1.7的“这个”功能是否与答案相关:Typescript PR for polymorphic 'this' type。我认为Immutable.js的人们仍在思考如何处理Record中的类型安全和继承。见证

虽然他们正在思考这个问题,但我正在思考记录是否值得他们提出的类型安全挑战。