Psacím stroji: nelze zapisovat heterogenní literálových polí

hlasů
13

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
Položena 03/10/2012 v 20:58
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
16

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ý [].

Odpovězeno 03/10/2012 v 21:05
zdroj uživatelem

hlasů
1

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}`); });
Odpovězeno 23/12/2015 v 00:30
zdroj uživatelem

hlasů
0

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[])[][]
Odpovězeno 07/06/2015 v 14:53
zdroj uživatelem

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