我需要什么类型的断言来编译?
class Foo {}
class Bar {}
var f =
[
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
错误:
Incompatible types in array literal expression
答案 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[])[][]