jaký typ tvrdí, musím si to sestavit?
class Foo {}
class Bar {}
var f =
[
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
chyba:
Incompatible types in array literal expression
jaký typ tvrdí, musím si to sestavit?
class Foo {}
class Bar {}
var f =
[
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
chyba:
Incompatible types in array literal expression
To bude fungovat:
class Foo {}
class Bar {}
var f: any[][] = [
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
To říká, že máte dvojrozměrné pole, jehož hodnoty mohou být cokoliv (Foo, Bar, jiné pole, atd). Dalo by se také použít typ tvrzení pro vaše vnořených polí:
class Foo {}
class Bar {}
var f = [
[<any>Foo, [1, 2, 3]],
[<any>Bar, [7, 8, 9]],
];
Přítomnost jediné jakékoliv ve vnitřním poli nutí kompilátor usoudit jeho typ jako každý [].
Vypadá to, že typescript dělá mají různorodé pole teď. Takže, protože tato otázka přišel jako první, když jsem se podíval na to, a protože je těžké najít jinak, zde, jak lze tento kód se píše:
class Foo {}
class Bar {}
var f: [Foo|Bar, number[]][] =
[[new Foo(), [1, 2, 3]],
[new Bar(), [7, 8, 9]]];
(Teď, když to jde dolů na silnici syntaxe typu napodobování výrazů typu by také získat syntaxi [Foo|Bar, [...number]][]...)
Dokonce to funguje s argumenty funkce, takže to typechecks jemné:
function foo([obj,nums]: [Foo|Bar, number[]]) {
for (let i of nums) console.log(`i = ${i}`);
}
f.forEach(foo);
a extrémní verze:
f.forEach(([obj,nums]: [Foo|Bar, number[]]) => {
for (let i of nums) console.log(`i = ${i}`); });
Jak strojopisem 1.4 můžete udělat typ organizace. Byl jsem schopen dosáhnout jako tak:
function zip<T, X> (array1: T[], array2: X[]): (T|X)[][] {
return array1.map(function (v: T, i: number) { return [v, array2[i]]; });
}
Konkrétní typ byste hledat ve vašem případě bude vypadat následovně:
(Foo|Bar|number[])[][]
Nebo:
(typeof Foo|typeof Bar|number[])[][]