Typescript : typeof instance!? Verständnisfrage



  • Hallo Leute,

    ich bin seit ner stunden an diesem Stücken Code

    interface Base
    {
        id:string;
    }
    
    interface  A extends Base
    {
        value:string
    }
    interface  B extends Base
    {
        value:string[]
    }
    
    type AB = A | B
    
    
    let x :AB  = {id:"er",value:"sewe"}
    let y :AB  = {id:"er",value:["1","2"]}
    
    console.log(typeof x)
    console.log(typeof y)
    

    ich habe einen Type A und Type B .. ich habe ein Objekt , geparst aus json-text und mappe diese dann in mein kombinierten AB type.. d.h. AB kann entweder A oder B enthalten.. aber wie kann ich nun prüfen ob der Inhalt vom Type A oer B ist!?! mit typeof , as, instanceOf k.a. finde ich es nicht heraus.. geht das überhaupt irgendwie? stehe aufm Schlauch:)

    typeof x bzw. typeof yy liefert mir nur "object"



  • So

    interface Base
    {
        id:string;
    }
    
    interface  A extends Base
    {
        value:string
    }
    interface  B extends Base
    {
        value:string[]
    }
    
    type AB = A | B
    
    function isA(v: AB): v is A {
        return (typeof v.value === 'string')
    }
    
    let x :AB  = {id:"er",value:"sewe"}
    let y :AB  = {id:"er",value:["1","2"]}
    
    console.log(isA(x))
    console.log(isA(y))
    

    ?



  • @manni66 sagte in Typescript : typeof instance!? Verständnisfrage:

    function isA(v: AB): v is A {
    return (typeof v.value === 'string')
    }

    function isA(v: AB): v is B {
        return (typeof v.value === 'string[]')
    }
    

    ?

    edit: ne das "string[]" geht nich.. ahh mist.. dachte as geht irgendwie



  • function isB(v: AB): v is B {
        return v.value instanceof Array;
    }
    


  • @manni66 sagte in Typescript : typeof instance!? Verständnisfrage:

    function isB(v: AB): v is B {
    return v.value instanceof Array;
    }

    ok super danke, wieso geht das denn nich mit instanceOf ? wohl nur bei classen nicht interfaces!?



  • Du hast in Javascript die fundamentalen Datentypen string, number, boolean (testen mit typeof) und die, die über eine Funktion definiert werden (Object, Array, eigene, testen mit instanceof). Ein typescript Interface existiert nur zur Compilezeit, kann also nicht zur Laufzeit getestet werden. Wenn du geparstes JSON (und nicht wie hier Objektliterale) verwendest, musst du alles testen, auch ob es Base ist.



  • Hmm ok danke , aber so ganz verstanden habe ich das ganze noch nicht,

    wenn ich folgendes mache, also statt interface , class nehme :

    class Base
    {
        id:string;
    }
    
    class A extends Base
    {
        value:string
    }
    class B extends Base
    {
        value:string[]
    }
    
    type AB = A | B
    
    let x :AB  = {id:"er",value:"sewe"}
    let y :AB  = {id:"er",value:["1","2"]}
    
    let h =  x instanceof A 
    console.log(h)
    let k =  y instanceof A 
    console.log(k)
    

    bekomme ich beides mal false.. hmm.. vestehe ich auch nich;)



  • @SoIntMan du kannst ein Instanz deiner Klasse nur mit new B erstellen. Warum typescript die Zuweisung hier zulässt kann ich dir nicht sagen, es ist aber anschliessend nur ein Object, kein A oder B. Du kannst mit JSON.parse nur Object, Array oder einen fundamentalen Datentyp erzeigen. Wenn du eine Instanz deiner Klasse mit den Werten haben möchtest, musst du sie selber Instanziieren und die Werte einzelen kopieren.



  • @manni66 sagte in Typescript : typeof instance!? Verständnisfrage:

    Wenn du eine Instanz deiner Klasse mit den Werten haben möchtest, musst du sie selber Instanziieren und die Werte einzelen kopieren.

    super danke für diese Anwort, genau das wäre die nächste fragen gewesen:) also ich kann quasi ein json-object als interface intepretieren lassen, mit einer klasse muss ich diese erst erzeugen, und dann ne deep copy selber tun.. hmm..



  • Guten Morgen ,

    noch eine Frage zu folgendem:

    class Base
    {
      id:string;
    }
    
    class A extends Base{
      i:number
    }
    
    class B extends Base{
      b:boolean
    }
    
    let x ={ id:"test", i:5}
    
    const a: Base = Object.assign(new A(), x);
    const b: Base = Object.assign(new B(), x);
    

    wenn ich das hier ausführe kommt folgendes raus:

    B { id: 'test', i: 5 }
    A { id: 'test', i: 5 }
    
    1. wieso mekkert er nicht?
    2. wieso hat typ B plötzlich ein property i und property b verschiendet!?

    P.s: was ich eigentlich vorhabe: ich bekomme json telegram rein, welche ich in objekte umwandle, nun will diese in konkrete classen typen dispatchen.. dafür muss ich prüfen ob das aus json generiete object exakt die signatur eine klassen types hat



  • wieso mekkert er nicht?

    Warum sollte er? Es bleibt unter Strich Javascript.

    wieso hat typ B plötzlich ein property i und property b verschiendet!?

    Es bleibt unter Strich Javascript. Du kannst Objekte komplett verändern. Hier verschwindet allerdings nichts, es war nie vorhanden. Du musst erst eine Zuweisung machen! Wenn du strictNullChecks einschaltest, gibt das immerhin einen Fehler, wenn du nichts zuweist.

    P.s: was ich eigentlich vorhabe: ich bekomme json telegram rein, welche ich in objekte umwandle, nun will diese in konkrete classen typen dispatchen.. dafür muss ich prüfen ob das aus json generiete object exakt die signatur eine klassen types hat

    Das Problem kenne ich. Ich habe mir dafür einen generator geschrieben, der Typescript- und C++-Klassen erzeugt, die sich selbst befüllen. Mir ist kein Weg mit Bordmitteln bekannt.



  • @manni66 sagte in Typescript : typeof instance!? Verständnisfrage:

    Das Problem kenne ich. Ich habe mir dafür einen generator geschrieben, der Typescript- und C++-Klassen erzeugt, die sich selbst befüllen. Mir ist kein Weg mit Bordmitteln bekannt.

    ahh .. das is beruhigend.. dann bau ich mir ne mapping factory;)


Log in to reply