reactjs - Cum să elimini eroarea TS2722: Nu poți apela un obiect care poate fi 'undefined'?


Am o funcție care arată așa

let bcInst;
if(props.onBoundsChanged){
    bcInst = kakao.maps.event.addListener(map, 'bounds_changed',()=>{
        props.onBoundsChanged(map); //I get error here
    })
}

interfața props arătând astfel

interface IMapProps{
    mapId?: string;
    longitude: number;
    latitude: number;
    level:number;
    onBoundsChanged?:{
        (map:any) : void
    }
}

Chiar dacă verific dacă props.onBoundsChanged există într-o instrucțiune if, primesc eroarea TS2722: Cannot invoke an object which is possibly 'undefined' la poziția unde folosesc props.onBoundsChanged. Cum pot rezolva această problemă?

Răspuns #1

TypeScript spune că onBoundsChanged ar putea fi nedefinit pentru că l-ai definit ca o proprietate opțională (?) în interfața IMapProps:

onBoundsChanged?: {}

Verificarea ta pentru onBoundsChanged pentru o valoare truthy este corectă, dar ascultătorul de eveniment va fi invocat mai târziu, ceea ce înseamnă că onBoundsChanged ar putea fi indefinit, așa cum a specificat @basarat. Poți evita această eroare utilizând una dintre aceste în interiorul ascultătorului tău.

Verificați valoarea adevărată înainte de a apela onBoundsChanged

if(props.onBoundsChanged) onBoundsChanged(map)

Folosește operatorul optional chaining ?. pentru a accesa onBoundsChanged

props?.onBoundsChanged(map)

Unele resurse utile pentru învățare:

Puteți citi mai multe despre valorile truthy pe MDN aici. https://developer.mozilla.org/en-US/docs/Glossary/Truthy

Mai multe despre operatorul optional chaining ?. aici. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

Răspuns #2

Am aceeași problemă ca mai jos. În cazul meu, codul meu este

 handleClick={(p: ActionFieldClickParam) =>
        this.props.handleClick({ p, index })
 }

Apoi, am rezolvat adăugând '?.' și am schimbat apelul funcției astfel: this.props.handleClick?.({ p, index })

În cazul tău, ar trebui să adaugi lângă funcția de apel:

props.onBoundsChanged?.(map)