将TypeScript包发布到npm时,该包提供的功能可以接受来自一个或多个对等依赖项的输入,如何定义可选的对等依赖项?
import { ExternalFoo } from 'foo';
import { ExternalBar } from 'bar';
export const customPackage = (source: ExternalFoo | ExternalBar) => {
/* ... */
}
当两个选项之一丢失时,如何防止使用我的包裹的人出错?
答案 0 :(得分:2)
自Typescript 3.8起,您可以使用以下语法:
import type { ExternalFoo } from "foo";
因此,如果您只是使用该库获取类型信息,则可能不必再将其列为dependency
或optionalDependency
。您可能更喜欢将其保留为peerDependency
,这样,如果您的用户具有这些依赖项,则他们将使用与您的库兼容的版本。当然,添加为devDependency
也很有用。
该导入仅存在于生成的d.ts
文件中,而不存在于.js
转码的代码中。但是,一个问题是,如果用户未安装该库,则该类型将变为any
,这可能会使您自己的键入有点混乱。例如,如果未安装foo
,您的功能将变为
customPackage = (source: any | ExternalBar) =>
// equivalent to customPackage = (source: any) =>
对于这个特殊的类型注释,它很烂,因为即使我安装了bar
,它也不会在类型检查中使用。因此,有了 一种不再依赖该库的方法,但是它不能解决编写类型注释的麻烦,如果那样的话,它不会崩溃。类型不存在。
答案 1 :(得分:1)
您的情况是当前TypeScript不能很好地支持这种情况。
让我们首先总结一下您的情况:
foo
和bar
是您的可选依赖项,这意味着您希望消费者将其中之一与库一起使用。dependencies
添加到您的package.json
customPackage
函数是公开的。由于要点3,您需要在库的类型中包括该类型,这意味着您需要添加foo
和bar
作为依赖项。这与第1点和第2点矛盾。
如果foo
和bar
的类型来自DefinitelyTyped(即来自软件包@types/foo
和@types/bar
的类型),则可以将它们添加为dependencies
在package.json
中。这样可以解决问题。
如果foo
和bar
的类型与库本身一起分发,则您必须将库包含为dependencies
(不需要),
或自己创建ExternalFoo
和ExternalBar
类型的副本。
这意味着您可以避免依赖foo
和bar
。
另一种方法是仔细查看您的库,查看将foo
和bar
作为依赖项是否有任何危害。根据您的图书馆的性质,它可能没有您想像的那么糟。
就个人而言,我通常会自己声明类型。 JavaScript是一种动态语言。