2016-08-20 32 views
10

Jaki jest odpowiedni sposób do czynienia z Map obiektów w ?ES6 Mapa w Flowtype

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

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

    ... 
} 

Błąd

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

Odpowiedz

11

Rodzaj animals.get(cageNumber) jest ?Animal nie Animal. Trzeba sprawdzić, że nie jest niezdefiniowany:

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

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

dodana aktualizacji – vkurchatkin

+0

Jeśli jedynym celem jest nie mieć 'void', można również użyć' if (animals.has (cageNumber)) ', która jest bardziej czytelny (i prawdopodobnie szybszy, ponieważ nie przydzielasz rzeczy, aby je usunąć zaraz po). Ale nie mam pojęcia, jak zwrócić coś właściwym typem, np. "Zwierzę". Według Flow twoje rozwiązanie i moje oba typy zwracania to 'void | Zwierzę ". Ma to sens, ponieważ prawdopodobnie nie chcesz, aby Flow odgadł, co robi twój kod, dlatego typ zwracany jest równy typowi 'animal'. Jeśli ktoś ma rozwiązanie tego, jestem zainteresowany. –