Geek tričko zdarma Python týden
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde
Pouze tento sleva až 80% na kurzy Python

Diskuze: angular 7 json

Aktivity (2)
Avatar
Ladislav Niderle:28. února 6:15

Ahoj, potřeboval bych poradit. Mám udělanou komunikaci se serverem pomocí http, kde dostanu jako odpověď json objekt. Problém je v tom, že když chci pustit takovou aplikaci znovu a pod získáním toho objektu mám dotaz třeba na objekt.code, tak mi to podrthne code a vypíše mi tuto hlášku:
error TS2339: Property 'code' does not exist on type 'any[]'.
Neví někdo prosím co s tím?

Zkusil jsem: Snažil jsem se podívat na webu, zda něco k tomu není psané, ale nebyl jsem zatím úspěšný :(.

Chci docílit: Snažím se dosáhnout toho, že budu schopen aplikaci spustit bez toho, abych tu chybu musel zakomentovat na začátku a pak zase odkomentovávat.

Předem moc děkuji za pomoc či radu.

 
Odpovědět 28. února 6:15
Avatar
Ilja Židkov
Člen
Avatar
Odpovídá na Ladislav Niderle
Ilja Židkov:28. února 7:13

Property 'code' does not exist on type 'any[]'.

Jelikož TypeScript je typovací jazyk, musíš dodat typ vlastnosti code (pokud samozřejmě existuje).

Asi takto:

ojbekt.code as string
 
Nahoru Odpovědět 28. února 7:13
Avatar
Odpovídá na Ilja Židkov
Ladislav Niderle:28. února 7:49

No u mně skoro ne, ale právě při té komunikaci se serverem to bude, jen nevím jak na to ani podle toho příkladu. Ukážu co myslím:

this.LicenseService.getAllModules().subscribe((value: any[]) => {
      console.log('Moduly: ', value);
        if (value.code === 'OK'){
        // zde se má něco vykonat, ale právě položka code je podtržená, že je chyba, co jsem již napsal.
}
    });
 
Nahoru Odpovědět 28. února 7:49
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Ladislav Niderle
Petr Štechmüller:28. února 8:23

Datový typ any[] reprezentuje pole jakéhokoliv vypu. Pole se standardně indexuje pomocí čísel. Ty chceš do pole přistoupit pomocí klíče, měl by jsi to tedy změnit na objekt:

any[] -> {}
Nahoru Odpovědět 28. února 8:23
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Ilja Židkov
Člen
Avatar
Odpovídá na Ladislav Niderle
Ilja Židkov:28. února 8:30

Předpokládám, že metoda getAllModules() je typu Observable<any[]>? Jaký očekáváš výstup?

[
    {
        "code": "OK",
        ...
    },
    ...
]

Alespoň o tohle se snažíš v podmínce.

 
Nahoru Odpovědět 28. února 8:30
Avatar
Vladislav Ladicky:28. února 8:58
...
if (value.code && value.code === 'OK') {
...
 
Nahoru Odpovědět 28. února 8:58
Avatar
Ladislav Niderle:28. února 11:49

No mám následující:

{
        "code": "OK",
        "msg": "...."
    },

a toto dostanu ze serveru. a při zapnutí přes ng serve mi to nyní vyhodí následující chybu:
error TS2339: Property 'code' does not exist on type '{}'
když jsem to value změnil na {}.
takže nejsem schopen přímo nachystat ten objekt, kdyý ho přebírám ze serveru a nevím jak to udělat, aby to při spuštění neházelo samé chyby.

 
Nahoru Odpovědět 28. února 11:49
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:28. února 13:10
<script>
// Firefox
var x = {
        "code": "OK",
        "msg": "zprava"
    };
alert(x);       //[object Object]
alert(x.code);  //OK
alert(x.msg);   //zprava
alert(x['code']);       //OK
alert(x['msg']);        //zprava
alert(x["code"]);       //OK
alert(x["msg"]);        //zprava
</script>

Pokud v nevis, zda v objektu neco mas ci ne, tak viz Ladislav

if (value.code && value.code === 'OK') {

value.code je bud (false / undefined / '"" / 0) nebo (true / "text" / 123)

Verim, ze podobne to funguje v angularu.

Property 'code' does not exist on type 'any[]'.
Pokud to pise tohle, znamena to, ze v tom poli code neexistuje. Nemuzes pouzit neco jako foreach jako v php a vypsat si cele pole? treba tve pole vypada takto:

var x = [{
        "code": "OK",
        "msg": "zprava"
    }];

To je pak neco jineho.

alert(x[0]['code']) //nebo x[0].code
 
Nahoru Odpovědět 28. února 13:10
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Ladislav Niderle
Petr Štechmüller:28. února 13:15

V předchozím příspěvku jsi přidal útržek kódu, ve kterém bylo toto:

console.log('Moduly: ', value)

Co to vypíše do konzole? Ať konečně zjistíme, jaký datový typ to je...

Nahoru Odpovědět 28. února 13:15
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Ladislav Niderle:28. února 13:47

Výsledek je toto:

{
        "code": "OK",
        "msg": "...."
    }

ale toto dostanu ze serveru, takže je clkem logicné, že když pouštím aplikaci, tak než komunikuju se serverem tak to samozřejmě ani neexistuje. IntelliJ mi to podtrhne sama hned a pak samozřejmě při ng serve mi to vyhodí chybu, když tou dobou ještě se serverem nekomunikuji. V normálním javascriptu/An­guarJS mu to vůbec nevadí a maximálně to padne až při tom dotazu, ale zde je prostě problém už jenom v tom, že to pole nebo v tomto přpípadě objekt nemám nikde definovaný, jelikož to posílá server, tak nemohu mít nikde přeci definovanou struktůru objektu, nebo se to dá?

 
Nahoru Odpovědět 28. února 13:47
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Ladislav Niderle
Petr Štechmüller:28. února 14:12

V TypeScriptu si můžeš nadefinovat interface, na který ten výsledek ze serveru pretypujes. Pak by Ti to už nemělo podtrhávat.

Nahoru Odpovědět 28. února 14:12
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Ladislav Niderle:28. února 15:01

Tak jsem si už nadefinoval ty interface a opravdu to pomohlo, ale nyní když mám vytvořený interface v jednom souboru a importuji to následně:

import { License } from "./license";
import { Result } from "./result";

v následujícím, tak mi to podtrhne právě to "./license"
a napíšemi že, File XY/license.ts is not a module.

Vzhled toho interfacu je následující:

interface License {
  code: string;
  msg: string;
}

Nevíte někdo proč to hlásí jako problém? bez toho mi MAVEN nedovolí udělat build bohužel

 
Nahoru Odpovědět 28. února 15:01
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Ladislav Niderle
Petr Štechmüller:28. února 15:01

ještě před interface dej slovíčko export ;-)

Nahoru Odpovědět 28. února 15:01
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Ladislav Niderle:28. února 16:19

Tak potom mi to vypíše toto zaa chybu:

ERROR in src/app/license/license.component.ts(173,7): error TS2696: The 'Object' type is assignable to very few other types. Did you mean to use the 'any' type instead?
  Type 'Object' is missing the following properties from type 'License': code, msg

u tohoto zápisu to podtrhne červeně: this.odpoved = value;

A proměnnou odpověď mám takto definovanou:

odpoved: License;
 
Nahoru Odpovědět 28. února 16:19
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Ladislav Niderle
Petr Štechmüller:28. února 16:25

Musíš to přetypovat

this.odpoved = <License> value;
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 28. února 16:25
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Ladislav Niderle:28. února 17:14

Moc děkuji, to je ono :)

 
Nahoru Odpovědět 28. února 17:14
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.