visual studio code - VSCode TypeScript Map get este încă considerat nedefinit chiar și cu un check has înainte


Dacă aș defini un Map simplu cu: const map=new Map<string, string>(); și mai târziu aș vrea să fac ceva cu el, m-aș aștepta ca acest lucru să funcționeze:

if (map.has(key)) {
    const value = map.get(key);
    // do something with it
}

Dar VSCode îmi dă această eroare pentru get:

Obiectul este posibil să fie 'undefined'.ts(2532)

Deci trebuie să revin la asta:

const value = map.get(key);
if (value) {
    // do something with it
}

Acest lucru pur și simplu nu se simte corect și face ca metoda has să fie aproape inutilă. Este aceasta o problemă de TypeScript sau o problemă de VSCode?

Răspuns #1

Am avut conflicte cu TS și VSCode despre această problemă exactă, dar în cazul meu, iterez peste valorile unui Map folosind metoda sa Map.keys() pentru a apela Map.get().

Am venit cu o soluție care „se simte” mult mai bine, cel puțin pentru mine. Pe baza întrebării tale, s-ar putea să se simtă mult mai bine și pentru tine!

/**
* parameterized function that asserts the object o is *NOT* undefined
* @param o the object we expect to *NOT* be undefined    
* @returns o, as T
*/
export function assertNotUndefined<T>(o: T | undefined): T {
    if (o === undefined) {
        throw new Error("provided object was undefined!");
    }
    return o as T;
}

Iată un exemplu de utilizare a acestuia, în scenariul pe care l-am menționat (deși această soluție ar putea fi folosită cu siguranță și în scenariul tău!)

let numbersMap: Map<string, number> = new Map([["one", 1],
                                               ["two", 2],
                                               ["three", 3]]);

for (var key of numbersMap.keys()) {
    let value: number | undefined = numbersMap.get(key);
    value = assertNotUndefined(value);
    /* no need to indent with an if-block, just a function call!!
    TS + VSCode are convinced that "value" is defined and so are we :) */
}

Nu trebuie să parametrizați apelul la assertNotUndefined() - se face automat.