【问题标题】:How to import npm packages without TypeScript definition such that IDE still provide intellisense?如何在没有 TypeScript 定义的情况下导入 npm 包以使 IDE 仍然提供智能感知?
【发布时间】:2017-01-01 15:33:59
【问题描述】:

我使用了一个没有 TypeScript 类型定义的 npm 包。确切地说,我使用的是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 甚至没有被识别为反应组件,如果我使用 Babel,我相信它会被识别(至少是没有类型的方法和属性)。

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

【问题讨论】:

  • 试试,preferences -> languages & frameworks -> JavaScript -> Libraries -> Add,并将你的 npm 模块添加为库。
  • @SergeyPanfilov 我已将 node_modules 中的 react-google-map 文件夹添加到您提到的位置,但我仍然没有得到模块的智能感知。还有什么我可能错过的吗?
  • @SergeyPanfilov 您的建议与打字稿无关。编译器不会查询 WebStorm 已配置的库。

标签: javascript typescript npm webstorm typescript-typings


【解决方案1】:

您需要声明您正在使用的内容,而不仅仅是使用any

例如:

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

    interface GoogleMapLoaderState {
        ....
    }

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

您可以从您正在使用并需要 IDE 支持的内容开始,然后慢慢添加。
您可以查看Writing Declaration Files 了解更多信息。

【讨论】:

  • react-google-map 不是我写的。这是我安装的一个 npm 包。所以,如果我想在我的 IDE 中为这个包提供智能感知,我将不得不为它写出整个定义文件?有没有办法,在不编写每个属性和方法定义的情况下,IDE 仍然可以识别包中的类、方法和属性,而没有像我使用 ES5/ES6 那样的类型?
  • 不,不是。 IDE 并不是真正的问题,因为 IDE 只是将编译器用作服务。您需要编译器了解发生了什么,然后 IDE 也会知道。定义文件(在大多数情况下)不是由库的制造商提供的,因此其他人(用户)编写.d.ts 文件并更新不同的存储库(例如DefinitelyTyped)。您的选择是在没有 IDE 支持的情况下使用 any 或自己编写一个。您不必将定义写入整个库,只需编写您需要的部分即可。
  • 嗯...但是如果我不使用 Typescript,至少我不会有基本的智能感知吗?我的意思是,如果我改用 Babel 或普通的 ES5,它没有任何定义文件,webstorm 仍然会根据包中编写的任何类成员、函数/变量为我提供基本的智能感知。但是对于“任何”Typescript 定义,似乎我已经覆盖了对这些函数/变量的任何识别,并且我从 IDE 获得了零支持?这就像“编写定义”或“根本没有智能感知”的场景?
  • 我没有足够的经验在 WebStorm 中只使用 js,而且我从未使用过 Babel,所以我无法真正回答这个问题。但是话虽如此,您添加了环境声明,因为您有一个 ts 错误,您通过将 GoogleMapLoader 定义为类型为 anyvar 解决了这个问题,所以从那时起您将得到什么......因为您重新使用 ts 你需要摆脱那个错误,没有办法解决这个问题(我知道)。
猜你喜欢
  • 2012-10-21
  • 2012-07-09
  • 2012-09-25
  • 2015-11-17
  • 1970-01-01
  • 2016-12-28
  • 2022-06-18
  • 1970-01-01
  • 2016-04-24
相关资源
最近更新 更多