Skip to content
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待

全局:修改模块

全局修改模块

全局修改模块在导入时会改变全局作用域中的现有值。 例如,可能存在一个库,在导入时向 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());

以下是一个示例

ts
// Type definitions for [~THE LIBRARY NAME~] [~OPTIONAL VERSION NUMBER~]
// Project: [~THE PROJECT NAME~]
// Definitions by: [~YOUR NAME~] <[~A 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 {};