0

I am trying to convert some of my old javascript code to typescript and I know I need to have all my types defined but here I have been having trouble because even if I define them I get an error.

This error is without the types defined on mapRef and current which are the two things that typescript is shouting me about.

Object is possibly 'undefined'.

This is the code without type definitions

const mapRef = React.useRef();
  const onMapLoad = React.useCallback((map) => {
    mapRef.current = map;
  }, []);
  
  const panTo = React.useCallback(({ lat, lng }) => {
    mapRef.current.panTo({ lat, lng }); // This line is shouting the error
    mapRef.current.setZoom(14); // This line is shouting the error
  }, []);

The way I have tried to define the types is as follows:

A) mapRef<Number>.current<Number>.panTo({ lat, lng });
B) mapRef<Any>.current<Any>.setZoom(14);
C) mapRef?.current?.panTo({ lat, lng });

But all of this presents new problems and errors... These are the error that I am getting if I do any of these

A) 'mapRef' refers to a value, but is being used as a type here. Did you mean 'typeof mapRef'?

B) Type 'MutableRefObject' has no signatures for which the type argument list is applicable.

C) Property 'panTo' does not exist on type 'never'.

Any help or any post, or documentation links are appreciated

1 Answer 1

1

You will need to explicitly tell TypeScript what you're going to box into the ref. I also explicitly default it to null here; you could use undefined too.

Assuming map is of type MyMap,

const mapRef = React.useRef<MyMap | null>(null);
const onMapLoad = React.useCallback((map) => {
  mapRef.current = map;
}, []);
  
const panTo = React.useCallback(({ lat, lng }) => {
  const map = mapRef.current;
  if(!map) return;  // No map (yet)? (This return narrows the type of `map` from `MyMap | null` to just `MyMap`, so the following work.)
  map.panTo({ lat, lng });
  map.setZoom(14);
}, []);

should be enough.

You may also need to annotate the onMapLoad callback's parameter (to e.g. MyMap or MyMap | null).

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you, This snipped helps me! do you also happen to know why this might be happening Property 'setZoom' does not exist on type 'GoogleMap' I am using the code structure only difference is MyMap is GoogleMap?
Very much depends on where you got that GoogleMap type from :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.