【问题标题】:How to import types from a third party library?如何从第三方库导入类型?
【发布时间】:2021-12-27 03:28:18
【问题描述】:

我有一个第三方库,它的类型在node_modules/thisLibrary/dist/interfaces.d.ts 中声明。 TS 编译器解析从该库导入的函数中使用的类型,因为工具提示会显示它们,并且当我进行不正确的分配时也会出现错误,但是当我想使用库的类型声明变量时(我显然需要这样做),我得到错误Cannot find name 'TypeName':

let myVar: TypeName; // `Cannot find name 'TypeName'`

我的tsconfig.json 中有以下设置:

"moduleResolution": "node",
   "include": [
        "src/**/*.ts",
        "src/**/*.tsx",
        "src/**/*.vue",
        "tests/**/*.ts",
        "tests/**/*.tsx",
        "node_modules/thisLibrary/dist/interfaces.d.ts",
        "../node_modules/thisLibrary/dist/interfaces.d.ts", // attempting various paths
    ],
 "typeRoots": [
        "node_modules/@types",
        "node_modules/thisLibrary/dist",
    ],

我在一些答案之后添加了includetypeRoots,但没有任何帮助。编译器看不到它并且库没有导出类型(如在库模块中),所以我无法导入它们:

import {type TypeName} from 'thisLibrary'; // results in "Module 'thisLibrary' has no exported member 'TypeName'".

我该如何解决这个问题?

【问题讨论】:

  • 如果你尝试使用来自某个库的内部类型/接口,这意味着出现问题:要么你没有正确使用它,要么库的作者犯了一个错误导出一些类型。在第二种情况下,如果这个库存储在那里,最好在 GutHub 中创建一个问题。
  • 这些类型在库的源文件中确实有“export”语句,并且 - 正如我所写 - 编译器看到导入函数中使用的定义并为类型提供工具提示,所以我的理解是他们确实以某种方式出口了它们?它们只是不能使用像import {TypeName } from 'thisLibrary' 这样的导入语句导入。但我不认为他们应该是private。但是当我在自己的代码中编写该名称以创建可以传递给导入函数的变量时,编译器无法识别该名称。所以我想我配置错误,问题是什么?
  • 很难说我们是否没有指向此库的链接以及您尝试导入的真实类型的界面。你能和我们分享一下吗?
  • 这是图书馆:javascript.rickandmortyapi.com
  • 你尝试导入什么类型的?

标签: typescript


【解决方案1】:

尝试直接从导出接口所在的文件导入。

import { TypeName } from 'thisLibrary/dist/interfaces'

【讨论】:

    【解决方案2】:

    You said that the types are exported from the lib,所以只需从库中导入类型,如下所示:

    import type {TypeName} from 'thisLibrary';
    
    // or in TS version >=4.5
    import {type TypeName} from 'thisLibrary';
    
    let myVar: TypeName; // ok
    

    TS Playground example

    【讨论】:

    • 它们是从定义它们的文件中导出的——是的。出于导入功能检查的目的,它们已被解析 - 是的。但是像您建议的导入以Module 'thisLibrary' has no exported member 'TypeName' 结尾
    • 在这种情况下,你要么没有安装包,要么包没有正确导出类型,this comment 是正确的:你应该向包 repo 提出问题。
    • 与此同时,您可以将包中的类型(及其所有依赖类型)复制到您的模块中,并直接使用它们,就像您自己编写它们一样。
    • 好的,谢谢。我肯定已经安装了包,因为我成功地从中导入了实际功能。我暂时复制了定义,但我认为我做错了什么可以修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    相关资源
    最近更新 更多