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
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
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 [].
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}`); });
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[])[][]