Typescript: nu se poate scrie literale de matrice eterogene

voturi
13

ce tip afirmă am nevoie pentru a obține acest lucru pentru a compila?

class Foo {}
class Bar {}

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

eroare:

Incompatible types in array literal expression
Întrebat 03/10/2012 la 20:58
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
16

Acest lucru va funcționa:

class Foo {}
class Bar {}

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

Aceasta spune ca ai o matrice bidimensională ale cărei valori pot fi nimic (Foo, Bar, alte tablouri, etc). Ai putea folosi, de asemenea, o afirmație de tip pentru matricile imbricate:

class Foo {}
class Bar {}

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

Prezența unei singure oricare din matrice interioară forțează compilator pentru a deduce tipul său ca orice [].

Publicat 03/10/2012 la 21:05
sursa de către utilizator

voturi
1

Se pare ca dactilografiat nu au matrici eterogene acum. Deci, din moment ce această întrebare a venit mai întâi când am căutat acest lucru, și , deoarece este greu să - l găsiți în caz contrar, aici modul în care acest cod poate fi scris acum:

class Foo {}
class Bar {}

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

(Acum , dacă acest lucru se duce în jos drumul de sintaxă tip mimand expresii, tipul ar obține , de asemenea , o sintaxă a [Foo|Bar, [...number]][]...)

Acesta funcționează chiar și cu argumente funcționale, astfel încât această typechecks fin:

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

f.forEach(foo);

și versiunea extremă:

f.forEach(([obj,nums]: [Foo|Bar, number[]]) => {
  for (let i of nums) console.log(`i = ${i}`); });
Publicat 23/12/2015 la 00:30
sursa de către utilizator

voturi
0

Ca dactilografiate 1.4 puteți face uniuni de tip. Am fost capabil de a realiza acest lucru astfel:

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

Tipul specific v-ar fi în căutarea în cazul dumneavoastră ar fi:

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

Sau:

(typeof Foo|typeof Bar|number[])[][]
Publicat 07/06/2015 la 14:53
sursa de către utilizator

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