2016-07-07 71 views
2

假設我有一個函數返回一個列表,其中包含可變數量的列表,每個列表包含首先可變數量的列表,然後將單個對象作爲名單的最後一名成員。在類型別名中聲明未知數量的列表

這裏有幾個輸出的例子:

output1 = [ 
    [ 
     [1, 2, 3], 
     { x: 1, y: 2 } 
    ], 
    [ 
     [4, 5, 6], 
     { x: 3, y: 4 } 
    ], 
    [ 
     [7, 8, 9], 
     { x: 5, y: 6 } 
    ] 
]; 

output2 = [ 
    [ 
     [1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9], 
     // however many more lists there are 
     { x: 1, y: 2 } 
    ], 
    [ 
     ['a', 'b', 'c'], 
     ['d', 'e', 'f'], 
     ['g', 'h', 'i'], 
     // however many more lists there are 
     { x: 3, y: 4 } 
    ], 
    // however many more lists there are 
]; 

列表中的內容的類型可以是any,但每個對象具有屬性xy,其中的每一個具有類型number

我該如何創建一個準確,專門顯示此類型的別名?

眼下,這就是我創造:

type Output = [ 
    [ 
     any[], // this is what I need help with 
     { x: number, y: number } 
    ][] 
] 
+1

我認爲你現在可以做的最好的是(任何​​[] | {x:number; y:number;})[]。但也許在未來休息/傳播屬性可以幫助https://github.com/Microsoft/TypeScript/issues/2103 – Magu

+0

是的,這將工作,直到有更好的事情出現。 – gliemezis

回答

0

您的結構沒有設計好,你爲什麼要使用一個數組的頂部結構,而不是一個對象?
你是否堅持結構(即:它是第三方lib或json結果的結果),還是可以改變它?

如果你可以改變它,那麼我建議你這樣做,因爲你可以有更多的控制。

type Output = Array<Array<number[] | { x: number, y: number }>>; 

let output1: Output = [ 
    [ 
     [1, 2, 3], 
     { x: 1, y: 2 } 
    ], 
    [ 
     [4, 5, 6], 
     { x: 3, y: 4 } 
    ], 
    [ 
     [7, 8, 9], 
     { x: 5, y: 6 } 
    ] 
]; 
+0

是的,一些結構調整可能是按順序的,但現在這會起作用。只要將'number []'改成'any []'就可以解決它。儘管@Magu提到,或許更快的解決方案會更好。 – gliemezis

+0

爲什麼你需要將'number []'改爲'any []'?你描述過它是一個數字數組......如果你使用'any',在大多數情況下,你做錯了什麼。 –

+0

對於這種情況,列表內容可以是'string','number'或者理論上的任何東西,比如'['a',1,undefined,4,'hello']'的組合。我在下面的例子中描述了它。 – gliemezis