因此,之所以如此与众不同,是因为地图脚本需要从您的应用程序包中单独下载。这不是典型的 npm install,您可以将 .js 和 .ts 很好地包装以供食用。
TLDR:类型可以通过 npm 安装,但 .js 脚本必须通过 <script> 标签下载(对于 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 中导入命名空间定义
有两种方法:
-
三斜杠指令
/// /node_modules/@types/googlemaps/index.d.ts" />
工作得很好,但不是那么优雅。
文档可以在这里找到:https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html
- 确保它是在
tsconfig.json 中导入的,并且由于它是导入的,因此您不需要额外导入一些东西
详细手册在这里:https://www.typescriptlang.org/docs/handbook/tsconfig-json.html
您应该检查compilerOptions 下的两个小节:
typeRoots 和 types
默认情况下,node_modules/@types 下的所有类型定义都会被导入,除非您明确指定了您需要的内容。
在我的特定情况下,我有以下部分:
"types": []
它禁用自动包含 @types 包。
删除此行为我解决了问题,同时添加三斜杠指令也有所帮助。但我选择了第二种解决方案。
至于“空”导入,我没有找到任何解释它是如何工作以及为什么工作的。我想它确实 NOT 导入任何模块或类,但它确实导入命名空间。此解决方案不适合我,因为 IDE 将此导入标记为“未使用”并且可以轻松删除。例如,webstorm 的命令 Ctrl+Alt+O - 美化代码并删除所有不必要的导入。