Dattiloscritto: non può scrivere letterali di array eterogenei

voti
13

che tipo asserisce ho bisogno di ottenere questo per compilare?

class Foo {}
class Bar {}

var f =
[
    [Foo, [1, 2, 3]],
    [Bar, [7, 8, 9]],
];

errore:

Incompatible types in array literal expression
È pubblicato 03/10/2012 alle 20:58
fonte dall'utente
In altre lingue...                            


3 risposte

voti
16

Questo funziona:

class Foo {}
class Bar {}

var f: any[][] = [
    [Foo, [1, 2, 3]],
    [Bar, [7, 8, 9]],
];

Questo dice che hai una matrice bidimensionale i cui valori possono essere qualsiasi cosa (foo, bar, altri array, ecc). Si potrebbe anche usare un tipo di asserzioni per gli array nidificati:

class Foo {}
class Bar {}

var f = [
    [<any>Foo, [1, 2, 3]],
    [<any>Bar, [7, 8, 9]],
];

La presenza di un unico qualsiasi a matrice interna costringe il compilatore di dedurre suo tipo come qualsiasi [].

Risposto il 03/10/2012 a 21:05
fonte dall'utente

voti
1

Sembra dattiloscritto fa avere array eterogenei ora. Quindi, dal momento che questa domanda è venuto prima quando ho guardato per questo, e dal momento che è difficile trovare in altro modo, qui come questo codice può essere scritto oggi:

class Foo {}
class Bar {}

var f: [Foo|Bar, number[]][] =
    [[new Foo(), [1, 2, 3]],
     [new Bar(), [7, 8, 9]]];

(Ora, se questo va giù la strada della sintassi tipo imitando le espressioni, il tipo sarebbe anche ottenere una sintassi di [Foo|Bar, [...number]][]...)

Funziona anche con gli argomenti delle funzioni, quindi questo typechecks bene:

function foo([obj,nums]: [Foo|Bar, number[]]) {
  for (let i of nums) console.log(`i = ${i}`);
}

f.forEach(foo);

e la versione estrema:

f.forEach(([obj,nums]: [Foo|Bar, number[]]) => {
  for (let i of nums) console.log(`i = ${i}`); });
Risposto il 23/12/2015 a 00:30
fonte dall'utente

voti
0

A partire dal tipografico 1.4 si può fare di tipo sindacati. Sono stato in grado di compiere questo modo:

function zip<T, X> (array1: T[], array2: X[]): (T|X)[][] {
    return array1.map(function (v: T, i: number) { return [v, array2[i]]; });
}

Il tipo specifico si sarebbe cercando nel tuo caso sarebbe:

(Foo|Bar|number[])[][]

O:

(typeof Foo|typeof Bar|number[])[][]
Risposto il 07/06/2015 a 14:53
fonte dall'utente

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