welche Art behauptet ich diese bekommen müssen, um zu kompilieren?
class Foo {}
class Bar {}
var f =
[
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
Error:
Incompatible types in array literal expression
welche Art behauptet ich diese bekommen müssen, um zu kompilieren?
class Foo {}
class Bar {}
var f =
[
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
Error:
Incompatible types in array literal expression
Das wird funktionieren:
class Foo {}
class Bar {}
var f: any[][] = [
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
Das sagt man ein zweidimensionales Array, dessen Werte kann alles (Foo, Bar, andere Arrays, usw.) sein. Sie könnten auch eine Art Behauptung für verschachtelten Arrays verwenden:
class Foo {}
class Bar {}
var f = [
[<any>Foo, [1, 2, 3]],
[<any>Bar, [7, 8, 9]],
];
Das Vorhandensein einer einzigen beliebigen in der inneren Anordnung zwingt den Compiler seinen Typ als beliebig [] abzuleiten.
Es sieht aus wie Typoskript hat jetzt heterogenen Arrays. Also, da diese Frage zuerst aufkam , als ich ausgesehen, und da es schwer ist , es anders zu finden, die hier , wie dieser Code kann jetzt geschrieben werden:
class Foo {}
class Bar {}
var f: [Foo|Bar, number[]][] =
[[new Foo(), [1, 2, 3]],
[new Bar(), [7, 8, 9]]];
(Nun, wenn dies geht auf dem Weg vom Typ Syntax Ausdrücke Nachahmung, würde die Art erhält auch eine Syntax [Foo|Bar, [...number]][] ...)
Es funktioniert auch mit Funktionsargumenten, so dass diese typechecks fein:
function foo([obj,nums]: [Foo|Bar, number[]]) {
for (let i of nums) console.log(`i = ${i}`);
}
f.forEach(foo);
und die extreme Version:
f.forEach(([obj,nums]: [Foo|Bar, number[]]) => {
for (let i of nums) console.log(`i = ${i}`); });
Ab Typoskript 1.4 können Sie Typ Gewerkschaften tun. Ich war in der Lage, dies zu erreichen, wie so:
function zip<T, X> (array1: T[], array2: X[]): (T|X)[][] {
return array1.map(function (v: T, i: number) { return [v, array2[i]]; });
}
Die spezifische Art Sie haben Interesse in Ihrem Fall wäre:
(Foo|Bar|number[])[][]
Oder:
(typeof Foo|typeof Bar|number[])[][]