TypeScript و"خرائط Google"

TypeScript هي مجموعة شاملة من JavaScript يتم تجميعها في JavaScript عادي. يوضّح الرمز النموذجي أدناه الاستخدام البسيط لـ "خرائط Google" باستخدام 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>
الاطّلاع على مثال

البدء

مشروع DefinitelyTyped هو برنامج مفتوح المصدر يحتفظ بملفات تعريف النوع للعديد من الحزم، بما في ذلك "خرائط Google". استخدِم NPM لتثبيت ملفات تعريف JavaScript في "خرائط Google" من حزمة ‎@types/google.maps:

npm i -D @types/google.maps

لمزيد من المعلومات، يُرجى الاطّلاع على الملفات المصدر على GitHub.

إضافة google.maps إلى خيار types tsconfig

إذا كان ملف tsconfig يضبط خيار برنامج التجميع types، يتضمّن TypeScript حزم @types المدرَجة في تلك الصفيفة فقط. لا يكفي تثبيت @types/google.maps لتفعيل دعم TypeScript لـ "خرائط Google"، ويتعذّر تجميع الرمز الذي يستخدم مساحة الاسم google مع ظهور الخطأ التالي:

Error T2503: Cannot find namespace 'google'.

لإضافة google.maps إلى مصفوفة types:

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

بدلاً من ذلك، أضِف التوجيه التالي إلى ملف بيان يتضمّنه مشروعك، مثل vite-env.d.ts:

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

لمزيد من المعلومات، يُرجى الاطّلاع على الأنواع.

حزم ‎ @types متعارضة

قد تستخدم بعض المكتبات حزمة أخرى غير ‎@types/google.maps، ما قد يؤدي إلى حدوث تعارضات. استخدِم خيار برنامج التجميع skipLibCheck لتجنُّب المشاكل المتعلّقة بالأنواع غير المتسقة:

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

تحديد typeRoots

قد تتطلّب بعض إطارات العمل، مثل Angular، تحديد خيار برنامج التجميع typeRoots لتضمين الأنواع المثبَّتة من @types/google.maps وجميع حِزم @types الأخرى.

يتم تلقائيًا تضمين جميع حزم @types المرئية في عملية التجميع. تُعتبر الحزم في node_modules/@types لأي مجلد مرفق مرئية:

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