2016-07-07 76 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