hva slags erkjenner å gjøre jeg trenger å få dette til å kompilere?
class Foo {}
class Bar {}
var f =
[
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
feil:
Incompatible types in array literal expression
hva slags erkjenner å gjøre jeg trenger å få dette til å kompilere?
class Foo {}
class Bar {}
var f =
[
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
feil:
Incompatible types in array literal expression
Dette vil fungere:
class Foo {}
class Bar {}
var f: any[][] = [
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
Dette sier du har en to-dimensjonal array med verdier kan være noe (Foo, Bar, andre arrays, etc). Du kan også bruke en type påstand for nestede matriser:
class Foo {}
class Bar {}
var f = [
[<any>Foo, [1, 2, 3]],
[<any>Bar, [7, 8, 9]],
];
Tilstedeværelsen av en enkelt hvilken som helst i den indre matrisen tvinger kompilatoren å utlede typen som helst [].
Det ser ut som Loggfila gjør har heterogene arrays nå. Så, siden dette spørsmålet kom opp først når jeg så på dette, og siden det er vanskelig å finne det ellers, her er hvordan denne koden kan skrives nå:
class Foo {}
class Bar {}
var f: [Foo|Bar, number[]][] =
[[new Foo(), [1, 2, 3]],
[new Bar(), [7, 8, 9]]];
(Nå hvis dette går nedover veien av type syntaks ligne uttrykk, typen vil også få en syntaksen [Foo|Bar, [...number]][]...)
Det fungerer selv med funksjonsargumenter, så dette typechecks fint:
function foo([obj,nums]: [Foo|Bar, number[]]) {
for (let i of nums) console.log(`i = ${i}`);
}
f.forEach(foo);
og den ekstreme versjonen:
f.forEach(([obj,nums]: [Foo|Bar, number[]]) => {
for (let i of nums) console.log(`i = ${i}`); });
Per Loggfila 1.4 kan du gjøre typen fagforeninger. Jeg var i stand til å oppnå dette slik:
function zip<T, X> (array1: T[], array2: X[]): (T|X)[][] {
return array1.map(function (v: T, i: number) { return [v, array2[i]]; });
}
Den spesifikke typen du ville være på jakt etter i ditt tilfelle vil være:
(Foo|Bar|number[])[][]
Eller:
(typeof Foo|typeof Bar|number[])[][]