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.
