使TypeScript看到依赖项捆绑的全局类型

时间:2018-10-25 11:51:37

标签: typescript

我有一个程序包,其中包含几个Web组件。它还为它们公开了JSX类型,以便它们可以在React中使用,而不会抱怨TypeScript。安装依赖项后,文件夹结构如下所示:

./node_modules/
  my-pacakge/
    src/...
    index.d.ts
    package.json

// package.json
{
    ...
    "types": "./index.d.ts",
    ...
}

// index.d.ts
declare namespace JSX {
    export interface IntrinsicElements { 
        'my-component': any,
        'my-other-component': any,
        'my-third-component': any
    }
}

当我尝试在JSX中使用<my-component></my-component>时,出现错误Property 'my-component' does not exist on type 'JSX.IntrinsicElements'.

如果我手动将index.d.ts文件复制到./node_modules/@types/my-package/index.d.ts,则错误消失了。

如果我在代码中的任何地方放置import 'my-package';,那么错误也会消失。

我想知道是否有一种方法可以让TypeScript看到我的类型,而无需在@types存储库中单独发布模块或在代码中添加导入。该软件包提供的Web组件通常是通过script标签插入的,因此对软件包进行显式导入只是为了让TypeScript挑选类型感到奇怪。

1 个答案:

答案 0 :(得分:0)

我不认为您会找到比将导入内容放入代码中更好的解决方案。

请注意,默认情况下,TypeScript的types mechanism自动加载@types范围内软件包的主类型声明文件(在主npm注册表上对应于DefinitelyTyped),但是此功能不适用于其他包装。我认为这是因为有多个DefinitelyTyped软件包(例如@types/node)为特定的目标环境提供了全局声明,并且在无需用户编写/// <reference types="node"/>的情况下加载这些声明的便利性被认为超过了发生事故的风险,但对于任意非@types软件包,则认为不适用。您可以尝试通过将主node_modules目录添加到typeRoots来获得加载所有程序包的机制,但是仅使用导入可能更明智。