npm里众多.d.ts文件是如何生成的

JavaScript010

npm里众多.d.ts文件是如何生成的,第1张

d.ts文件是由TypeScript编译器生成的,这些文件包含了JavaScript中可用的接口和对象的定义,以及它们之间的关系。TypeScript编译器可以根据JavaScript代码自动生成.d.ts文件,也可以根据用户自定义的.d.ts文件生成JavaScript代码。

我们的目标是建立一个前端组建库, 使用的技术栈是father+docz,同时要支持typescript, 在build出来的es目录中要能够生成“.d.ts”后缀的类型声明文件,因为只有生成类型声明文件,我们在使用自己开发的组件库的时候才能获得更好的开发体验。

之所以写下这篇文章,是因为自己在使用father-build建设内部组件库的过程中,遇到了一些问题且难以找到相关文档,将自己的经验总结下来希望看到这篇文章的人能避开这些坑,更加顺利地搭建好自己的前端组件库。

package.json

其中,main指定了入口文件,module对应es module的输出,types对应你的typings文件,这样在组件在被使用的时候编辑器才能识别出你的组件类型声明

.fatherrc.js 配置father build打包方式, 具体详情可以参考 umijs/father

tsconfig.json typescript的配置文件,注意只有declaration设置为true才能生成.d.ts后缀的文件

接下来我们在components目录创建第一个自己的组件,下面是一个button的例子:

样式文件可以直接使用less编写

然后在入口文件index.ts将其导出,暴漏给外部使用。

使用文档的后缀名为".mdx", 语法与markdown类似,更多详情参考 docz 的文档

我们可以执行 yarn start ,来实时查看文档的效果。

现在命令行执行 yarn build 即可对组件库进行打包了,注意我们在.fatherrc中配置了esm和cjs两种打包方式,对应会生成 es 和 lib两个目录,其中 esm对应的是 es目录,cjs对应lib目录。

正常情况下,在的es和lib目录下应该已经为我们写的ts源码自动生成了“.d.ts”后缀的类型声明文件,如果没有生成,请仔细对比.fatherrc.js和tsconfig.json这两个配置文件,另外还要注意的是,如果我们基于antd封装业务组件库的话,不要在组件库中使用css module,否则也会造成无法自动产生类型声明文件的问题。

文章未能详尽部分,可以参考这个demo的github源码地址: https://github.com/xitengfei/xui-components , 有问题欢迎批评指正。

ts 调用 js

步骤

找到 js 调用 js 的方法。

增加方法调用的声明。 请参考 如何生成 .d.ts 。

示例

js 内的方法

function callJsFunc(msg) {    console.log("msg from egret : " + msg)}

ts 内声明

declare function callJsFunc(msg:string)//可以放在 ts 文件内(建议在顶部或者底部,中间的没试过)或者单独放到一个 .d.ts 文件中,请不要放在其他类型的文件内。msg 类型根据函数体判断。

ts 内调用

callJsFunc("hello js")

输出

msg from egret : hello js

总结:在 js 调用 js 的基础上增加声明。其他的比如变量等,也是按上面步骤来实现。

js 调用 ts

js 调用 ts 其实就是 ts 调用 ts,由于 ts 调用 ts 可能会有同模块下的省略写法,因此只要使用不同模块下的调用来写即可。

步骤

找到非同一模块下 ts 的调用(比如 example.A.CallEgretFunc("hello"))。

完全按上面调用的方式来写 (比如上面的 example.A.CallEgretFunc("hello"))。

示例

ts 内的方法

module exampleA {    export class A {        public callEgretMethod(msg:string):void {            console.log("method msg from js : " + msg)       }        public static CallEgretFunc(msg:string):void {            console.log("static msg from js : " + msg)       }    }}

非同一模块下 ts 调用

module exampleB {    export function b() {        //调用方法        var a:exampleA.A = new exampleA.A()       a.callEgretMethod("method")       //调用静态函数        exampleA.A.CallEgretFunc("function")   }}

js 内调用

var a = new exampleA.A()//去掉 a 的类型a.callEgretMethod("method")exampleA.A.CallEgretFunc("function")

输出

method msg from js : methodstatic msg from js : function