簡體   English   中英

TypeScript中的強類型Immutable.js記錄

[英]Strongly typed Immutable.js Records in TypeScript

我找不到這個問題的好資源。 本質上,我想使用TypeScript中的接口來描述數據的類型,但是我的數據是Immutable.js記錄,這似乎使事情變得復雜,請參見下面的示例。

interface tree extends Immutable.Map<string, any> {
  readonly id: number,
  readonly type: number
}

let trees = Immutable.List<tree[]>([
  Map<tree>({
     id: 101,
     type: 1
  }),
  Map<tree>({
     id: 201,
     type: 3
  })
])

上面的問題:

  1. 為什么我必須重復列表中每個地圖的類型? 創建列表時,類型不應該由<tree[]>簡單聲明嗎? 然后針對此添加到列表的任何Map進行類型檢查?
  2. 目前,此示例錯誤,指出“屬性'id'與索引簽名不兼容。類型'number'不能分配給類型'樹'。這是有道理的!但是,閱讀文檔后,我無法弄清楚如何使它正常工作?閱讀文檔時說我需要一個ID,但是我想要一個映射數組,如果我沒記錯的話,我的簽名就是標准數組ID。

我已經為此工作了好幾天,但我根本無法使它起作用,根據我所讀的所有內容,它應該是如此簡單。

任何幫助將不勝感激。

您正在創建trees arrays List ,這是擴展的Map 它應該是這樣的:

let trees = Immutable.List<tree[]>(
    [ // List
        [ // Array
            <tree>Immutable.Map<any>({
                id: 101,
                type: 1
            }),
            <tree>Immutable.Map<any>({
                id: 201,
                type: 3
            })
        ]
    ]
);

回答您的問題:

  1. 您沒有在重復每個地圖的類型。 實際上,您正在調用Map方法,該方法從對象構建地圖。 我添加了<tree>強制轉換,因為它是一排trees而不是地圖。
  2. 您正在嘗試類似:

     var singleTree: tree = Immutable.Map<tree>( { id: 101, type: 1 } ); 

    但是您的樹是any類型的地圖。 因此,這是正確的語法:

     let singleTree: tree = <tree>Immutable.Map<any>( { id: 101, type: 1 } ); 

對於上面的代碼,如果我們創建tree函數來包裝Map函數,則可以簡化並強制進行類型檢查,因此最終的解決方案是:

function tree(obj: { [key: string]: any, id: number, type: number }): tree {
    return <tree>Immutable.Map<any>(obj);
}

let trees = Immutable.List<tree[]>(
    [ // List
        [ // Array
            tree({
                id: 101,
                type: 1
            }),
            tree({
                id: 201,
                type: 3
            })
        ]
    ]
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM