TypeScript:无法编写异构数组文字

时间:2012-10-03 19:58:48

标签: typescript

我需要什么类型的断言来编译?

class Foo {}
class Bar {}

var f =
[
    [Foo, [1, 2, 3]],
    [Bar, [7, 8, 9]],
];

错误:

Incompatible types in array literal expression

3 个答案:

答案 0 :(得分:16)

这将有效:

class Foo {}
class Bar {}

var f: any[][] = [
    [Foo, [1, 2, 3]],
    [Bar, [7, 8, 9]],
];

这表示你有一个二维数组,其值可以是任何值(Foo,Bar,其他数组等)。您还可以为嵌套数组使用类型断言:

class Foo {}
class Bar {}

var f = [
    [<any>Foo, [1, 2, 3]],
    [<any>Bar, [7, 8, 9]],
];

内部数组中存在单个any会强制编译器将其类型推断为任何[]。

答案 1 :(得分:3)

看起来,typescript 现在有异构数组。所以,从那以后 当我寻找这个问题时,这个问题首先出现了,因为它很难 为了找到它,在这里如何编写这段代码:

class Foo {}
class Bar {}

var f: [Foo|Bar, number[]][] =
    [[new Foo(), [1, 2, 3]],
     [new Bar(), [7, 8, 9]]];

(现在,如果这样下去了类型语法模仿表达式的道路, 该类型还将获得[Foo|Bar, [...number]][] ...)

的语法

它甚至可以使用函数参数,所以这个样子很好:

function foo([obj,nums]: [Foo|Bar, number[]]) {
  for (let i of nums) console.log(`i = ${i}`);
}

f.forEach(foo);

和极端版本:

f.forEach(([obj,nums]: [Foo|Bar, number[]]) => {
  for (let i of nums) console.log(`i = ${i}`); });

答案 2 :(得分:1)

从Typescript 1.4开始,您可以键入联合。我能够像这样完成这个:

function zip<T, X> (array1: T[], array2: X[]): (T|X)[][] {
    return array1.map(function (v: T, i: number) { return [v, array2[i]]; });
}

您在案例中寻找的具体类型是:

(Foo|Bar|number[])[][]

或者:

(typeof Foo|typeof Bar|number[])[][]