Skip to content
目录

比如,当你想使用JS代码扩展另一个库时:

js
import { greeter } from 'super-greeter'

// 普通Greeter API
greeter(2)
greeter('Hello world')

// 我们使用一个运行时的新函数扩展对象
import 'hyper-super-greeter'
greeter.hyperGreet()

super-greeter 定义:

typescript
/*~ 这个示例展示了如何给你的函数添加多个重载 */
export interface GreeterFunction {
  (name: string): void
  (time: number): void
}

/*~ 本示例展示如何导出接口指定的函数 */
export const greeter: GreeterFunction

我们可以像下面一样扩展已有模块:

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

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

/*~ 在这一行,导入此模块添加到的模块 */
import { greeter } from 'super-greeter'

/*~ 这里声明上面你导入的相同模块
 *~ 然后对已有 greeter 函数声明进行扩展
 */
export module 'super-greeter' {
  export interface GreeterFunction {
    hyperGreet(): void;
  }
}

这使用到了 声明合并 😎。

ES6对模块插件的影响

有些插件会在已有模块基础上,添加顶层导出或者修改顶层导出。这在CommonJS和其它loaders中是合法的,ES6 模块被认为是不可变的,因此这种模式是不可能的

WARNING

因为TypeScript是加载器无关的,所以没有在编译时强制执行该策略,但是打算转换到ES6模块加载器的开发人员应该意识到这一点。

原文档:

2022年09月03日12:15:16