我正在尝试通过 DefinitelyTyped 导入一个模块,以及它的类型定义包中的一些类型。我安装了两个:
npm i -D leaflet
npm i -D @types/leaflet
(这将是一个传单插件,需要传单作为 peerDependency
,因此 -D
传单本身)。
在 .ts
文件的顶部,我尝试导入这些:
import L from 'leaflet';
import type { LatLng } from 'leaflet'
但是 typescript 告诉我 Module '"/Users/seth/Documents/GitHub/leaflet-topography/node_modules/@types/leaflet/index"' 没有默认的 export.ts(1192)
.这是真的,但我不是要从类型定义中导入 L
,而是从传单包本身导入。为什么 typescript 假设这是一个类型定义?我怎样才能改变它,以便我导入的 L
是传单库本身?
最佳答案
Why is typescript assuming that this is a type definition?
整个目的 d.ts
文件或类型 Declaration files
是为 typescript 提供有关用 JavaScript
编写的 API 的类型信息。您仍在阅读 leaflet
包,但 typescript 编译器将为 API 在 typescript 平台下工作寻找类型定义文件。这将有助于 typescript 使用 d.ts
文件中定义的类型注释进行所有静态类型分析。
当你为 leaflet 安装 @typings
时,它将成为 typescript 生态系统的一部分。
How can I change that so that the L that I'm importing is the leaflet library itself?
如上所述,typescript 将查找 leaflet API 的类型定义文件,实际上是调用 leaflet API 的详细信息。
根据传单类型定义文件的定义,L
是一个命名空间,没有默认导出。所以你必须像下面这样导入这个命名空间 -
import * as L from 'leaflet';
如果您要从传单中导入任何特定的类,那么您可以使用以下语法 -
import { Circle } from 'leaflet'; //**NOTE DON'T MISS THE CURLY BRACES**
修复错误的其他选项是更改 tsconfig.json 文件中的设置
"allowSyntheticDefaultImports": true /* Allow default imports from modules with no default
export. This does not affect code emit, just typechecking. */
关于用于导入类型定义而不是主模块的 TypeScript 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64417328/