对 Typescript npm 库使用 @types,而无需上游项目安装该依赖项



我们有一个用TypeScript编写的npm库包,其中包含供其他项目使用的各种实用程序。 我们只称此库为lib-utils

lib-utils使用的库之一是d3.lib-utils同时具有对d3的 peerDependency 和 devDependency 以及对@types/d3的 devDependency 。

并非所有使用lib-utils包的项目都会使用lib-utils中的d3代码,所以我不希望这些项目被迫提供它。

然而,为了在内部使用d3lib-util的几个源文件正在使用import * as d3 from "d3"导入d3以获得编译时检查。 这似乎对任何使用lib-utils的上游库的d3提出了运行时要求,即使它们不使用d3部分。 当上游项目在浏览器中加载时,我在加载lib-utils并尝试加载d3时收到 404 错误。

我尝试使用以下每个方法:

  1. /// <reference path="../../node_modules/@types/d3/index.d.ts" />
  2. /// <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 中删除该导入。