Loggfila: kan ikke skrive heterogene matrise konstanter

stemmer
14

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
Publisert på 03/10/2012 klokken 19:58
kilden bruker
På andre språk...                            


3 svar

stemmer
16

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 [].

Svarte 03/10/2012 kl. 20:05
kilden bruker

stemmer
3

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}`); });
Svarte 23/12/2015 kl. 00:30
kilden bruker

stemmer
1

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[])[][]
Svarte 07/06/2015 kl. 14:53
kilden bruker

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