我们有一个用TypeScript编写的npm库包,其中包含供其他项目使用的各种实用程序。 我们只称此库为lib-utils
。
lib-utils
使用的库之一是d3
.lib-utils
同时具有对d3
的 peerDependency 和 devDependency 以及对@types/d3
的 devDependency 。
并非所有使用lib-utils
包的项目都会使用lib-utils
中的d3
代码,所以我不希望这些项目被迫提供它。
然而,为了在内部使用d3
,lib-util
的几个源文件正在使用import * as d3 from "d3"
导入d3
以获得编译时检查。 这似乎对任何使用lib-utils
的上游库的d3
提出了运行时要求,即使它们不使用d3
部分。 当上游项目在浏览器中加载时,我在加载lib-utils
并尝试加载d3
时收到 404 错误。
我尝试使用以下每个方法:
/// <reference path="../../node_modules/@types/d3/index.d.ts" />
/// <reference type="d3">
在需要 D3 的lib-utils
里面,但在使用常规模块导入之前我无法解决编译问题,这似乎是我问题的根源。
如何在不要求lib-utils
包的使用者也提供 d3 的情况下lib-utils
获取 TypeScript 类型签入?
我正在使用 systemjs 进行打包。 简单地指示 systemjs 忽略 d3 的解决方案可能会起作用,但我更愿意在lib-utils
而不是每个消费者中解决这个问题。
除了使用注释中的systemjs
配置外,您还可以在导入语法中仅导入所需的类型。
问题是当你说import * as d3 from 'd3'
,编译器假设你需要整个d3
库,包括代码部分。
你应该做:
import { SomeType, SomeOtherType } from 'd3'
// code away
仅导入类型时,编译器将从 JS 中删除该导入。