Maszynopis: nie można napisać heterogenicznych literałów tablicowych

głosy
13

Jaki typ twierdzi muszę uzyskać to skompilować?

class Foo {}
class Bar {}

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

błąd:

Incompatible types in array literal expression
Utwórz 03/10/2012 o 20:58
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
16

To będzie działać:

class Foo {}
class Bar {}

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

Ten mówi, że masz tablicę dwuwymiarową, którego wartość może być cokolwiek (foo, bar, inne macierze, etc). Można również użyć typu twierdzenie dla zagnieżdżonych tablic:

class Foo {}
class Bar {}

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

Obecność pojedynczego każdy w wewnętrznej tablicy zmusza kompilator wyprowadzić jako dowolny typ [].

Odpowiedział 03/10/2012 o 21:05
źródło użytkownik

głosy
1

Wygląda na to, maszynopis nie mają tablic heterogenicznych teraz. Tak, ponieważ ta kwestia podszedł pierwszy, kiedy spojrzał na to, a ponieważ trudno go odnaleźć inaczej, oto jak ten kod może być napisany teraz:

class Foo {}
class Bar {}

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

(Teraz, jeśli to idzie w dół drogi typu składni naśladującego wyrażeń, typ będzie również uzyskać składni [Foo|Bar, [...number]][]...)

Działa to nawet z argumentów funkcji, więc typechecks porządku:

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

f.forEach(foo);

a skrajna wersja:

f.forEach(([obj,nums]: [Foo|Bar, number[]]) => {
  for (let i of nums) console.log(`i = ${i}`); });
Odpowiedział 23/12/2015 o 00:30
źródło użytkownik

głosy
0

Jak maszynopisu 1.4 można zrobić związków typu. Udało mi się to osiągnąć w taki sposób:

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

Specyficzny rodzaj byś szukał w twoim przypadku będzie:

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

Lub:

(typeof Foo|typeof Bar|number[])[][]
Odpowiedział 07/06/2015 o 14:53
źródło użytkownik

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