【问题标题】:TypeScript tring to import type definition instead of main module用于导入类型定义而不是主模块的 TypeScript 字符串
【发布时间】:2021-02-01 15:19:41
【问题描述】:

我正在尝试通过DefiniteTyped 导入一个模块,以及它的类型定义包中的一些类型。我都安装了:

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 leaflet definitelytyped


    【解决方案1】:

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

    import * as L from "leaflet";
    

    【讨论】:

    • 我想到了,但是如果我这样做L.Something = someVar,我会收到这样的错误:Property 'Something' does not exist on type 'typeof import("...my-project/node_modules/@types/leaflet/index")'.。因此,它似乎仍在尝试从类型声明而不是主包中提取定义。还是我不应该相信 vscode 智能感知?
    • 哦,好吧,如果我理解正确,您是在尝试用 TypeScript 编写 Leaflet 插件吗?虽然这在某种程度上肯定是可行的,但如果您尝试复制所有 Leaflet 约定,尤其是 SubClass 和 subfactories,我会想起一些问题。在您的情况下,我认为您需要将您的类单独添加到 Leaflet 命名空间。 “它仍在尝试从类型声明而不是主包中提取定义”:是的,TS 仅在可用时从类型中知道定义。
    • import L from 'leaflet';import * as L from "leaflet"; 都不适合我。我尝试使用打字稿版本 3.9.9 和 4.2.2。我收到 ERROR in node_modules/leaflet-geosearch/dist/SearchControl.d.ts:1:8 - error TS1192: Module... node_modules/@types/leaflet/index"' 没有默认导出。
    • 嗨@BanAnanas,请随时用您的具体问题的详细信息提出您自己的问题
    【解决方案2】:

    为什么 typescript 假设这是一个类型定义?

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

    当您为传单安装@typings 时,它将成为打字稿生态系统的一部分。

    我怎样才能改变它,以便我导入的 L 是传单 图书馆本身?

    如上所述,打字稿将寻找传单 API 的类型定义文件,该文件实际上正在调用传单 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. */
    

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 2019-04-04
      相关资源
      最近更新 更多