发布TypeScript包时如何处理可选的对等项依赖关系?

时间:2019-01-27 20:57:45

标签: typescript npm publishing

将TypeScript包发布到npm时,该包​​提供的功能可以接受来自一个或多个对等依赖项的输入,如何定义可选的对等依赖项?

import { ExternalFoo } from 'foo';
import { ExternalBar } from 'bar';

export const customPackage = (source: ExternalFoo | ExternalBar) => {
    /* ... */
}

当两个选项之一丢失时,如何防止使用我的包裹的人出错?

2 个答案:

答案 0 :(得分:2)

自Typescript 3.8起,您可以使用以下语法:

import type { ExternalFoo } from "foo";

因此,如果您只是使用该库获取类型信息,则可能不必再将其列为dependencyoptionalDependency。您可能更喜欢将其保留为peerDependency,这样,如果您的用户具有这些依赖项,则他们将使用与您的库兼容的版本。当然,添加为devDependency也很有用。

该导入仅存在于生成的d.ts文件中,而不存在于.js转码的代码中。但是,一个问题是,如果用户未安装该库,则该类型将变为any,这可能会使您自己的键入有点混乱。例如,如果未安装foo,您的功能将变为

customPackage = (source: any | ExternalBar) =>
// equivalent to customPackage = (source: any) =>

对于这个特殊的类型注释,它很烂,因为即使我安装了bar,它也不会在类型检查中使用。因此,有了 一种不再依赖该库的方法,但是它不能解决编写类型注释的麻烦,如果那样的话,它不会崩溃。类型不存在

Reference

答案 1 :(得分:1)

您的情况是当前TypeScript不能很好地支持这种情况。

让我们首先总结一下您的情况:

  1. foobar是您的可选依赖项,这意味着您希望消费者将其中之一与库一起使用。
  2. 您仅使用这些库中的类型信息,这意味着您没有任何代码依赖性,也不想将它们作为dependencies添加到您的package.json
  3. 您的customPackage函数是公开的。

由于要点3,您需要在库的类型中包括该类型,这意味着您需要添加foobar作为依赖项。这与第1点和第2点矛盾。

如果foobar的类型来自DefinitelyTyped(即来自软件包@types/foo@types/bar的类型),则可以将它们添加为dependenciespackage.json中。这样可以解决问题。

如果foobar的类型与库本身一起分发,则您必须将库包含为dependencies(不需要), 或自己创建ExternalFooExternalBar类型的副本。

这意味着您可以避免依赖foobar

另一种方法是仔细查看您的库,查看将foobar作为依赖项是否有任何危害。根据您的图书馆的性质,它可能没有您想像的那么糟。

就个人而言,我通常会自己声明类型。 JavaScript是一种动态语言。