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