如何引用在NPM包中由tsc的“声明”选项生成的TypeScript .d.ts文件中声明的类型?

问题描述:

大图:我的组织有几个用TypeScript编写的Angular应用程序,每个应用程序都包含大量重复的代码。我们已经开始将我们可重复使用的TypeScript代码打包为NPM包并将它们发布到TFS 2017中的私有NPM注册表中。我们使用Gulp将可重用TypeScript代码编译为JavaScript(使用gulp-typescript)并使用“声明“tsconfig.json中的属性强制产生一个.d.ts文件。这是有效的,并且.d.ts文件与NPM包中的JavaScript输出一起包含在客户端应用程序中。但是,在消费应用程序中引用其中的类型不起作用,除非我直接在消费应用程序中引用.d.ts文件,而我希望避免这种情况。如何引用在NPM包中由tsc的“声明”选项生成的TypeScript .d.ts文件中声明的类型?

我们使用TypeScript 2.5和@types方法来访问第三方类型,所以例如Angular我在package.json文件中有“@ types/angular”:“1.6.32” - 这会导致node_modules \ @types \ angular \ index.d.ts成立时,Visual Studio似乎神奇地发现,当我在TypeScript文件中键入ng.IServiceProvider时,该文件提供了强大的类型检查。

但是,它并没有神奇地发现我自己的Typings文件,它位于node_modules \ my-package \ dist \ my-package.d.ts。但是,如果我将其添加到TypeScript文件中:

/// <reference path="../../../node_modules/my-package/dist/my-package.d.ts" /> 

然后我可以引用文件中定义的类型。然而,这不是一个很好的解决方案,因为它意味着每个消费应用程序都需要知道node_modules文件夹中的路径,以及我创建的每个自定义类型文件。据推测这是@types语法应该避免的。

有没有一种方法,使消费项目神奇发现包含与NPM包内自定义分型文件(相对于分型是在他们自己的权利发布为包文件?)我知道我可以做后者,但我真的不想为每个我们创建的自定义NPM包创建一个单独的@types包,只要我能避免它。

我找到了一种方法,使这项工作:

{ 
    "name": "my-package", 
    "main": "./dist/my-package.js", 
    "types": "./dist/my-package.d.ts" 
} 

在您需要将引用添加到捆绑的类型包装如上图所示的NPM包中的package.json文件。这使得Visual Studio为包中包含的类型提供引用并提供intellisense。