2016-08-20 1 views
10

Was ist die geeignete Weise mit Map Objekte in zu tun?ES6 Karte in FlowType

const animals:Map<id, Animal> = new Map(); 

function feedAnimal(cageNumber:number) { 
    const animal:Animal = animals.get(cageNumber); 

    ... 
} 

Fehler

const animal:Animal = animals.get(cageNumber); 
         ^^^^^^^^^^^^^^^^^^^^^^^^ call of method `get` 

const animal:Animal = animals.get(cageNumber); 
         ^^^^^^^^^^^^^^^^^^^^^^^^ undefined. This type is incompatible with 
const animal:Animal = animals.get(cageNumber); 
         ^^^^^^^ Animal 

Flowtype Map declaration

Antwort

11

Typ animals.get(cageNumber) ist ?Animal, nicht Animal. Sie müssen prüfen, ob es nicht undefiniert ist:

function feedAnimal(cageNumber:number) { 
    const animal = animals.get(cageNumber); 

    if (!animal) { 
    return; 
    } 
    // ... 
} 
+0

hinzugefügt Update – vkurchatkin

+0

Wenn das einzige Ziel ist es, nie 'void' haben, dann können Sie auch' verwenden, wenn (animals.has (cageNumber)) 'die mehr ist lesbar (und wahrscheinlich schneller, da Sie keine Dinge zuweisen, um sie gleich danach zu entfernen). Aber ich habe keine Ahnung, wie man etwas mit dem richtigen Typ zurückgibt, dh. 'Animal'. Laut Flow Ihre Lösung und meine beiden Rückgabetypen sind 'void | Tier'. Dies ist sinnvoll, weil Sie Flow wahrscheinlich nicht raten lassen möchten, was Ihr Code tut, daher entspricht der Rückgabetyp dem Typ "Tier". Wenn jemand eine Lösung dafür hat, bin ich interessiert. –