javascript - 如何在没有 TypeScript 定义的情况下导入 npm 包,以便 IDE 仍然提供智能感知?

标签 javascript typescript npm webstorm typescript-typings

我使用的 npm 包没有 TypeScript 的类型定义。确切地说,我正在使用 react-google-maps 库。

按照他们的例子,我从包中导入了以下组件:

import {GoogleMapLoader, GoogleMap, Marker} from "react-google-maps";

但是,TypeScript 在编译期间会抛出一个错误:

error TS2305: Module '"react-google-maps"' has no exported member 'GoogleMapLoader'.

因此,我的快速解决方法是声明模块及其类型为“any”的成员:

declare module "react-google-maps" {
    export var GoogleMapLoader:any;
}

但是,现在的问题是我的 IDE (WebStorm) 不再提供智能感知。 GoogleMapLoader 甚至没有被识别为 react 组件,我相信如果我使用 Babel,它会被识别(至少是没有类型的方法和属性)。

如何导入没有类型定义的 npm 包以供 TypeScript 编译器解析,同时又不妨碍 IDE 提供智能感知?

最佳答案

您需要声明您正在使用什么,而不是仅仅使用any

例如:

declare module "react-google-maps" {
    interface GoogleMapLoaderProps {
        ....
    }

    interface GoogleMapLoaderState {
        ....
    }

    class GoogleMapLoader extends React.Component<GoogleMapLoaderProps, GoogleMapLoaderState> { }
}

你可以从你正在使用的和需要IDE支持的东西开始,慢慢地添加东西。
您可以查看 Writing Declaration Files有关如何执行此操作的更多信息。

关于javascript - 如何在没有 TypeScript 定义的情况下导入 npm 包,以便 IDE 仍然提供智能感知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39141261/

相关文章:

javascript - 除了轮询之外还有其他方法来检测 Chrome 开发工具中更改了哪些类样式吗?

javascript - 为什么我的 NextJS 代码会运行多次,如何避免?

node.js - 修改 Node.js req 对象参数

javascript - 计数器不断重置为 setInterval 循环上声明的变量

css - 如何公开从 npm 安装的 css 文件?

npm - 我的 chrome 版本自动更新到 115 版本,当我运行 webdriver-manager update 命令时,为什么它下载 114 版本的 chrome?

javascript - 使用 Underscore 删除使用嵌入数组的对象

Angular 4 : Disabling nested form validators

typescript - 如何在 typescript tsx 代码中扩展 jsx 元素的属性?

npm - 软件包未安装 - "Error: tunneling socket could not be established"