TypeScript y Google Maps

TypeScript es un superconjunto tipado de JavaScript que se compila en JavaScript simple. En el siguiente código de muestra, se demuestra el uso simple de Google Maps con TypeScript:

TypeScript

async function init(): Promise<void> {
    // Import the needed libraries.
    await google.maps.importLibrary('maps');

    // Access the map.
    const mapElement = document.querySelector('gmp-map')!;
    // Access the underlying map object.
    const innerMap = mapElement.innerMap;

    console.log({ mapElement, innerMap });
}

void init();

JavaScript

async function init() {
    // Import the needed libraries.
    await google.maps.importLibrary('maps');

    // Access the map.
    const mapElement = document.querySelector('gmp-map');
    // Access the underlying map object.
    const innerMap = mapElement.innerMap;

    console.log({ mapElement, innerMap });
}

void init();

CSS

/* 
 * Optional: Makes the sample page fill the window. 
 */
html,
body {
    height: 100%;
    margin: 0;
    padding: 0;
}

HTML

<html>
    <head>
        <title>Simple Map</title>

        <link rel="stylesheet" type="text/css" href="./style.css" />
        <script type="module" src="./index.js"></script>
        <script>
            // prettier-ignore
            (g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})({
                key: "GOOGLE_MAPS_API_KEY"
            });
        </script>
    </head>

    <body>
        <gmp-map center="-34.397,150.644" zoom="8" map-id="DEMO_MAP_ID">
        </gmp-map>
    </body>
</html>
Ver ejemplo

Comenzar

El proyecto DefinitelyTyped es un proyecto de código abierto en el que se encuentran los archivos de declaración de tipo de muchos paquetes, incluido Google Maps. Usa NPM para instalar los archivos de declaración de JavaScript de Google Maps desde el paquete @types/google.maps:

npm i -D @types/google.maps

Para obtener más información, consulta los archivos de origen en GitHub.

Agrega google.maps a la opción types de tsconfig

Si tu archivo tsconfig establece la opción de compilador types, TypeScript incluye solo los paquetes @types que se indican en ese array. Instalar @types/google.maps no es suficiente para habilitar la compatibilidad con TypeScript para Google Maps, y el código que usa el espacio de nombres google no se compila con el siguiente error:

Error T2503: Cannot find namespace 'google'.

Para agregar google.maps al array types, haz lo siguiente:

{
  "compilerOptions": {
    "types": ["google.maps"]
  }
}

Como alternativa, agrega la siguiente directiva a un archivo de declaración que incluya tu proyecto, como vite-env.d.ts:

/// <reference types="google.maps" />

Para obtener más información, consulta Tipos.

Paquetes @types en conflicto

Algunas bibliotecas pueden usar un paquete que no sea @types/google.maps, lo que puede causar conflictos. Usa la opción del compilador skipLibCheck para evitar problemas de tipos inconsistentes:

{
  "compilerOptions": {
    "skipLibCheck": true
  }
}

Especifica typeRoots

Algunos frameworks, como Angular, pueden requerir que se especifique la opción del compilador typeRoots para incluir tipos instalados desde @types/google.maps y todos los demás paquetes @types.

De forma predeterminada, todos los paquetes @types visibles se incluyen en tu compilación. Los paquetes en node_modules/@types de cualquier carpeta que los contenga se consideran visibles:

{
  "compilerOptions": {
    "typeRoots": [
      "node_modules/@types"
    ]
  }
}