用于导入类型定义而不是主模块的 TypeScript 字符串

TypeScript tring to import type definition instead of main module

我正在尝试导入一个模块,以及通过 DefinitelyTyped 从其类型定义包中导入一些类型。我安装了两个:

npm i -D leaflet
npm i -D @types/leaflet

(这将是一个传单插件,需要传单作为 peerDependency,因此传单本身需要 -D)。

.ts 文件的顶部,我尝试导入这些:

import L from 'leaflet';
import type { LatLng } from 'leaflet'

但是打字稿告诉我 Module '"/Users/seth/Documents/GitHub/leaflet-topography/node_modules/@types/leaflet/index"' has no default export.ts(1192)。没错,但我不是要从类型定义中导入 L,而是要从传单包本身导入。为什么打字稿假设这是一个类型定义?我怎样才能改变它,以便我导入的 L 是传单库本身?

根据您的构建引擎/TypeScript 编译器的配置方式,您可能需要将其写为:

import * as L from "leaflet";

Why is typescript assuming that this is a type definition?

d.ts 文件或类型 Declaration files 的全部目的是为打字稿提供有关 JavaScript 中编写的 API 的类型信息。您仍在阅读 leaflet 包,但打字稿编译器将寻找 API 的类型定义文件以在打字稿平台下工作。这将有助于使用 d.ts 文件中定义的类型注释进行所有静态类型分析的打字稿。

当您安装 @typings for leaflet 时,它将成为打字稿的一部分 eco-system。

How can I change that so that the L that I'm importing is the leaflet library itself?

如上所述,typescript 将查找传单 API 的类型定义文件,这实际上是调用传单 API 详细信息。

来自传单类型定义文件的定义 L 是一个命名空间,没有默认导出。所以你必须导入这个命名空间如下 -

import * as L from 'leaflet';

如果您要从传单中导入任何特定的 class,那么您可以使用以下语法 -

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. */