Maschinenschrift: nicht heterogene Array Literale schreiben

stimmen
13

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
Veröffentlicht am 03/10/2012 um 20:58
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
16

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.

Beantwortet am 03/10/2012 um 21:05
quelle vom benutzer

stimmen
1

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}`); });
Beantwortet am 23/12/2015 um 00:30
quelle vom benutzer

stimmen
0

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[])[][]
Beantwortet am 07/06/2015 um 14:53
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more