【问题标题】:How to install Typescript typings for google maps如何为谷歌地图安装 Typescript 打字
【发布时间】:2016-07-04 01:06:03
【问题描述】:

怎么做 - 我已经尝试过组合

typings install [googlemaps | google.maps] [--ambient] --save

最终会出现此错误的变化

打字错误!消息无法在注册表中找到“npm”的“googlemaps”。

按照艾米的建议,我也下载到相关目录并添加了

/// <reference path="main/ambient/google.maps/google.maps.d.ts" />

发给我的main.d.ts(一个明显正在读取的文件,因为我没有收到其他错误)。

我在网上找不到任何东西来回答这个问题

我的最终目标是摆脱这种错误

错误 TS2503:找不到命名空间“google”。

【问题讨论】:

标签: typescript


【解决方案1】:

因此,之所以如此与众不同,是因为地图脚本需要从您的应用程序包中单独下载。这不是典型的 npm install,您可以将 .js.ts 很好地包装以供食用。

TLDR:类型可以通过 npm 安装,但 .js 脚本必须通过 &lt;script&gt; 标签下载(对于 SPA,此标签可以即时附加到您的网页改善应用的初始加载时间,这就是我所做的)。

我的推荐路径如下:

安装

npm install --save-dev @types/googlemaps

导入

import {} from 'googlemaps';

加载和使用(此功能确保地图脚本只附加到页面一次,以便可以反复调用)

addMapsScript() {
  if (!document.querySelectorAll(`[src="${googleMapsUrl}"]`).length) { 
    document.body.appendChild(Object.assign(
      document.createElement('script'), {
        type: 'text/javascript',
        src: googleMapsUrl,
        onload: () => doMapInitLogic()
      }));
  } else {
    this.doMapInitLogic();
  }
}

请记住,必须将地图脚本附加到页面,并且必须在其他任何事情发生之前下载该脚本。例如,如果您使用 Angular,我将 addMapsScript() 逻辑包装在一个 observable 中并放入我的地图组件路由解析器中。

使用类型(类型定义包括但不限于):

const mapRef: google.maps.Map;
const bounds: google.maps.LatLngBounds;
const latLng: google.maps.LatLng;

摆脱警告:@types/googlemaps/index.d.ts' is not a module.

在您的项目根目录中添加一个名为 index.d.ts 的文件并插入以下内容:

declare module 'googlemaps';


2018 年 6 月 1 日更新(@DicBrus 的调查结果):

为了导入 google 命名空间并摆脱恼人的错误“找不到命名空间 'google'”,您应该确保已在 @types/googlemaps 中导入命名空间定义

有两种方法:

  1. 三斜杠指令

    /// /node_modules/@types/googlemaps/index.d.ts" /> 工作得很好,但不是那么优雅。

文档可以在这里找到:https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html

  1. 确保它是在tsconfig.json 中导入的,并且由于它是导入的,因此您不需要额外导入一些东西

详细手册在这里:https://www.typescriptlang.org/docs/handbook/tsconfig-json.html

您应该检查compilerOptions 下的两个小节: typeRootstypes

默认情况下,node_modules/@types 下的所有类型定义都会被导入,除非您明确指定了您需要的内容。

在我的特定情况下,我有以下部分:

"types": []

它禁用自动包含 @types 包。

删除此行为我解决了问题,同时添加三斜杠指令也有所帮助。但我选择了第二种解决方案。

至于“空”导入,我没有找到任何解释它是如何工作以及为什么工作的。我想它确实 NOT 导入任何模块或类,但它确实导入命名空间。此解决方案不适合我,因为 IDE 将此导入标记为“未使用”并且可以轻松删除。例如,webstorm 的命令 Ctrl+Alt+O - 美化代码并删除所有不必要的导入。

【讨论】:

  • doMapInitLogic() 是一个您可以创建的函数(您可以随意重命名它)。你来对了吗?
  • 是的,它可以是 Javascript,但是我想知道您为什么要查看关于 Typescript 的这个问题? ;) 如果您只使用 Javascript,我建议您首先查看 Google 的官方文档developers.google.com/maps/documentation/javascript/tutorial
  • 所以,你实际上不需要 Typescript 来使用谷歌地图,在使用地图 API 时有类型定义真是太好了。现在,如果您尝试声明一个新的 google.maps.Map,您仍然会收到打字稿错误 - 类似于“未定义 google”。你可以做些什么来解决这个问题,在你的源文件的顶部(在你的班级之外)写下'declare const google'。
  • 嘿,我想我找到了一个更干净的版本:/// &lt;reference types="googlemaps" /&gt;:解析这些包名的过程类似于在导入语句中解析模块名的过程。将三斜杠引用类型指令视为声明包的导入的一种简单方法。 typescriptlang.org/docs/handbook/triple-slash-directives.html 这样就不需要丑陋的相对路径了!
  • 2021:我必须将“google.maps”添加到types,而不是“googlemaps”
【解决方案2】:

在实践中,我的用例是 Angular CLI,我只需要

npm install --save @types/google-maps

【讨论】:

  • 在 Ionic2 RC3 中测试:你需要 "@types/google-maps" 加上 "typings install dt~google.maps --global" 和 "/// "
  • 是的!搜索了大约 5 个小时.. 我必须安装 @types 如上所述,但仍然必须添加行 /// 在我想要使用它的组件中的导入上方。
【解决方案3】:

我在我的 ionic 2 项目中测试了这些步骤,并且效果很好:

  1. 全局安装typings

npm install typings --global
  1. 通过打字安装 google.maps

typings install dt~google.maps --global --save
  1. 打开 tsconfig.json 并将 "typings/*.d.ts" 添加到您的“include”数组中,如下所示 (tsconfig.json)。

{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
    "declaration": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": [
      "dom",
      "es2015"
    ],
    "module": "es2015",
    "moduleResolution": "node",
    "sourceMap": true,
    "target": "es5"
  },
  "include": [
    "src/**/*.ts",
    "typings/*.d.ts"
  ],
  "exclude": [
    "node_modules"
  ],
  "compileOnSave": false,
  "atom": {
    "rewriteTsconfig": false
  }
}

【讨论】:

  • 在我的情况下,我缺少“typings/*.d.ts”的 tsconfig.json 部分。但现在我面临一个新问题。大量与“重复标识符”相关的编译错误。
  • @BecarioSenior 你一定已经修好了。仅供日后参考。如果您在 tsconfig.json 中添加文件(作为第 3 步),请删除 typings/index.d.ts 文件内容,因为两者都在做基本相同的事情,因此它会加载谷歌地图内容两次,因此会发生重复错误。
【解决方案4】:

typings install google.maps --global

您需要 --global(以前是 --ambient)标志来搜索 DefinitlyTyped

【讨论】:

  • 看起来我的命令顺序错误,然后我试过了
  • Typings 已从 [v1.0.0] (github.com/typings/core/releases/tag/v1.0.0) typings install google.maps --globaltypings install dt~google.maps --global 开始将术语“环境”更改为“全局”
【解决方案5】:

目前正确的安装方式是:

typings install dt~google.maps --global [--save]

【讨论】:

    【解决方案6】:

    从打字稿 2 开始

    npm install --save @types/googlemaps
    

    将 typeroots 添加到您的 tsconfig 中

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

    【讨论】:

    • 为什么需要typeRoots?这应该是默认值。
    • @torazaburo 很接近,但不完全相同。将typeRoots 关闭意味着将检查每个封闭文件夹中的每个node_modules/@types(可能来自不需要的父文件夹)。我猜将其限制为./node_modules/@types/ 使其更容易预测。
    【解决方案7】:

    我努力在窗口上定义google对象,终于找到了一个好方法,通过扩展Window接口。

    只需用这个创建一个google-maps.d.ts 文件:

    import '@types/googlemaps';
    
    declare global {
      interface Window {
        google: typeof google;
      }
    }
    

    并将其添加到您的 root 文件夹中名为 types 的目录中。 然后在你的tsconfig.json 文件中指向这个文件夹。

    // tsconfig.json
    compilerOptions: {
       ...
       "typeRoots": [
         "node_modules/@types",
         "types"
       ],
       ...
    }
    

    【讨论】:

      【解决方案8】:

      我的解决方案(适用于 Vue2.x):

      安装

      npm install --save @types/googlemaps
      

      将脚本添加到 index.html

      <script src="https://maps.googleapis.com/maps/api/js?key=XXX&libraries=YYYY"></script>
      

      在根文件夹 types/index.d.ts 中创建

      将下一行放在此处:

      /// <reference path="../node_modules/@types/googlemaps/index.d.ts" />
      declare module 'googlemaps';
      

      打开 tsconfig.json 并将“types/*.d.ts”添加到您的“include”数组中。

        "include": [
          "src/**/*.ts",
          "src/**/*.tsx",
          "src/**/*.vue",
          "tests/**/*.ts",
          "tests/**/*.tsx",
          "types/**/*.d.ts"
        ],
      

      【讨论】:

        【解决方案9】:

        最简单的方法是使用 triple-slash directive。幸运的是,有一种替代语法可以利用标准包解析:

         /// <reference types="googlemaps" />
        

        【讨论】:

        • 这是在 VS Code 上对我有用的唯一解决方案。对我来说,我没有更改tsconfig,也没有添加任何d.ts 文件。
        • 在经历了很多痛苦之后,这个解决方案让我在 Vercel + next.js 上工作。谢谢!
        【解决方案10】:

        斯蒂芬保罗清楚地解释了一切,但有一些重要的事情要提一下。 tsconfig 可以相互扩展。扩展一个可以覆盖父级。在我的情况下,我在 app 目录下有另一个 tsconfig.app.json 有

        types: []
        

        数组。正如斯蒂芬已经解释过的,这个空数组覆盖了 typeRoots。因此,只需删除所有相关 tsconfig 文件中的所有类型数组并确保

        "typeRoots": ["node_modules/@types"]
        

        存在。 不用说必须安装@types@googlemaps

        【讨论】:

          【解决方案11】:

          对于 Angular9+ 的用户,我强烈建议使用他们的官方组件

          第 1 步:安装:

          npm install --save-dev @angular/google-maps

          第 2 步:注册

          @NgModule({
            imports: [
              GoogleMapsModule
            ]
          })
          export class AppModule { }
          

          第 3 步:实施

          <google-map [center]="center" [options]="options"></google-map>
          
          center = new google.maps.LatLng(-30.5595, 22.9375);
          options: google.maps.MapOptions = {
            mapTypeId: 'hybrid',
          };
          

          查看https://medium.com/angular-in-depth/google-maps-is-now-an-angular-component-821ec61d2a0了解更详细的指南

          【讨论】:

          • 如果您查看@angular/google-maps 的源代码,您会发现它们只是使用此处提供的三斜杠指令解决方案:stackoverflow.com/a/54581130/10893。除了导入之外,他们只是添加了一堆可能需要也可能不需要的控件。
          【解决方案12】:

          好吧,我在我的 Angular 11 项目中尝试了以上所有方法但没有成功,最后official typing from google 解决了我的问题:

          npm install --save @types/google.maps
          

          【讨论】:

            【解决方案13】:

            新的 @types/google__maps 非常适合我们。原来的(@types/googlemaps)很棘手,并且有很多浏览器依赖项(如HTMLElement),如果在 nodejs 环境中使用它,TS 编译会失败。

            npm install @types/google__maps -D

            所以我们在 DefinitelyTyped 中有 googlemapsgoogle-mapsgoogle__maps。区别解释如下: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/29625#issuecomment-429207839

            【讨论】:

            • @types/google__maps 和 @types/googlemaps 用于完全不同的库,前者用于节点,后者用于浏览器。
            • Y,这就是我特别提到in a nodejs environment的原因。 :)
            • 还有@types/google.maps
            【解决方案14】:

            如果您在预览时遇到错误消息Cannot find namespace ‘google’,那么您需要做两件事。

            1. 安装谷歌地图插件

              npm install @google/maps

            2. 只需将谷歌地图导入app.component.ts 文件

              import { google } from '@google/maps';

            来源:https://medium.com/javascript-in-plain-english/integrate-google-maps-to-your-angular-application-step-by-step-guide-3604aadb76d1

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-05-22
              • 2020-07-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-02-23
              相关资源
              最近更新 更多