Skip to content
目录

全局修改模块

全局修改模块(global-modifying modules)在导入时修改全局作用域中的现有值。 比如,可能存在一个模块在导入时给 String.prototype 添加新的成员。这种模式可能很危险,可能导致运行时冲突😅,但是我们仍可给它写一个声明文件。

识别全局修改模块

全局修改模块一般很容易从它的文档中进行识别。通常,它们类似于全局插件,但是需要 require 调用激活它们的副作用。

你可能看到它们的文档是这样的:

js
// 'require' 调用,但不使用其返回值😅
var unused = require('magic-string-time')
// 或者
require('magic-string-time')

var x = 'hello, world'
// 对内置类型创建一个新的方法
console.log(x.startsWithHello())

var y = [1, 2, 3]
// 对内置类型创建一个新的方法
console.log(y.reverseAndSort())

下面是一个例子:

typescript
// 对 [~THE LIBRARY NAME~] [~可选版本号~] 的类型定义
// Project: [~项目名~]
// Definitions by: [~你的名字~] <[~URL FOR YOU~]

/*~ 💡这是一个针对『全局修改』模块的模板文件. 你应该将它重命名为 index.d.ts
 *~ 并将它放在和模块同名的文件夹中
 *~ 例如, 如果你正在给 "super-greeter" 文件写类型声明
 *~ 则该文件应该是 'super-greeter/index.d.ts'
 */

/*~ 🚨:如果你的全局修改模块时可调用或可构造的,
 *~ 你将需要结合 类模块或函数模块模板 中的模式😎
 */
declare global {
  /*~ 这里,声明在全局命名空间中的类型或存在于已有声明中的参数
   */
  interface String {
    fancyFormat(opts: StringFormatOptions): string;
  }
}

/*~ 如果你的模块导出类型或值,就正常在此书写即可 */
export interface StringFormatOptions {
  fancinessLevel: number;
}

/*~ 例如,在模块上声明一个方法(以及它的全局副作用) */
export function doSomething(): void;


/*~ 🚨🚨如果你的模块没有导出任何内容,你将需要这一行。否则,删除它 */
export {};

原文档:

2022年09月03日13:45:27