2015-11-18 36 views
1

我有下面的定義(我使用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]) 
}) 

我加入了數10List<Record<ISession>>

任何爲什麼我沒有看到任何錯誤?

+0

你提供的例子似乎並不完整 - 我看不到'Map'類/方法定義在哪裏。 – Fenton

回答

0

這不是一個真正的答案,但它不適合在評論框中。

@Sohnee,對於上面評論中的問題,@ppoliani正在擴展Immutable.js中的類型,所以這就是Map(以及List和Record)的來源。

我不知道TS 1.7的「這個」功能是否與答案Typescript PR for polymorphic 'this' type有關。我認爲Immutable.js的人們仍然在反思如何處理記錄中的類型安全和繼承問題。證人

雖然他們對此反思,但我正在反思記錄是否值得他們提出的類型安全挑戰。