15

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

class Foo {}
class Bar {}

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

错误:

Incompatible types in array literal expression
4

3 回答 3

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 会强制编译器将其类型推断为 any[]。

于 2012-10-03T20:05:26.580 回答
7

看起来打字稿现在确实有异构数组。所以,由于这个问题是我在寻找这个问题时首先出现的,并且因为很难找到它,所以现在如何编写这段代码:

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}`); });
于 2015-12-23T00:30:07.567 回答
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[])[][]
于 2015-06-07T14:53:46.863 回答