33 书写声明文件之砍柴:为不同类型库书写声明文件
5.3.1 模块插件或 UMD 插件 一些模块和插件是支持插件机制的,比如我们常见的 jQuery,它的插件有非常多。我们可以为库书写声明文件的同时,为库的插件定义声明文件,可以参考官方模板 module-plugin.d.ts。 5.3.2 全局插件 全局插件往往会修改全局中一些对象,在这些对象上添加或修改属性方法,比如下面的示例: // add-methods-to-string.js String.prototype.getFirstLetter = function() { return this[0]; }; 这段代码在 String 构造函数的原型对象上添加一个 getFirstLetter 方法,这个方法可以返回字符串的第一个字符。我们创建一个字符串,就可以调用这个方法。来讲下这个原理,我们在 String 构造函数原型对象上添加一个方法,这个方法就会被 String 创建的实例继承,如果我们使用new String(‘Lison’)的方式创建一个实例 name,那么这个 name 将是一个对象类型的值,它的属性是 0 开始到 n 的数字,属性值对应字符串的第 1 个、第 n 个字符;但是像例子中这样使用const name = 'Lison’字面量的形式定义的 name,其实是个字符串类型的值,字符串就不会继承构造函数的方法了,以为它不是对象,但事实是它可以调用getFirstLetter方法。这是因为它在调用方法的时候,会先将这个字符串包装成一个封装对象,在内部即使用 String 构造函数,所以它依然可以调用原型对象上的方法。 我们在 html 文件里引入这个 js 文件后创建一个字符串,这个字符串就可以调用 getFirstLetter 方法: <script type="text/javascript" src="./add-methods-to-string.js"></script> <script type="text/javascript"> var str = "Lison"; console.log(str.getFirstLetter()); // "L" </script> 如果我们在 TS 中使用,就需要为这个创建声明文件,我们创建一个声明文件 global-plugin.d.ts:...