TypeScript 中的 Module

TypeScript 中的 Module

本文主要介绍 TS 中的 module 与 non-modules 的区别;.d.ts 文件的作用;以及模块路径的解析规则;

TS 中规定顶层存在 import 、export 关键字的代码文件被认为是一个模块,没有顶层 import 、export 的文件认为是一般脚本。

模块与脚本的区别

模块 modules 与脚本 non-modules 存在以下几个方向上的区别, 这是 JavaScript 中模块与脚本的区别(TypeScript 同样)。

  • 作用域上的区别
    • module 存在自己的作用域。在模块中定义的变量、函数、类都存在于自己的作用域上,外部模块和脚本代码不可见。
    • non-modules 运行在 global scope 上。顶层定义的变量、函数、类都存在于全局作用域上。外部模块和脚本均可访问。
  • 导出和导入
    • module 使用 import export 关键字来分别控制从其他模块导入代码段(变量、函数、类等)以及导出模块中的代码段。
    • non-modules 中定义的函数和变量在全局作用域中,因此不需要额外的导入导出操作,直接可全局访问。
  • 代码管理
    • module 便于代码切分组织,可按照抽象层次或者功能进行模块划分,便于代码组织。
    • 脚本代码一般都是写在统一的几个文件中,需要注意变量的访问顺序,并且有污染全局作用域的风险需要规避。
  • 依赖管理
    • 模块依赖是通过 import 来显示指定依赖关系,允许更好的控制依赖关系,可以降低命名上冲突的可能性。
    • 脚本的依赖关系是隐藏的(需要认真阅读代码,逐层debug才能分析清楚),脚本按照架子啊的顺序执行,脚本之间加载的顺序很重要【脚本加载的顺序变化可能出现: 函数未找到,变量未定义等错误 】
  • 加载时序
    • 模块支持异步加载,加载完成后在进行代码执行,可以减少HTML文档解析上的阻塞。
    • 脚本是经典的同步加载,在HTML中出现同步脚本则需要等待代码加载并执行完成后HTML解析才继续执行。通常代码中除了部分需要提前执行的代码(权限检查,用户校验等),其余的都放在HTML文档的末尾进行加载(可显式异步加载)执行。
// oneModule.js

export function foo(params) {
    //...
}

export class Bar {
    constructor() {
        //...
    }
}
// twoModule.js

import { foo, Bar } from './oneModule.js';

export function run(){
    const ins = new Bar();

    // ...
    return foo(ins);
}

TS 中模块加载机制

模块之间建立关系是靠 import 和 export 来配合使用的,模块加载的时候路径指定有两种方式一种是相对路径另一种是非相对路径。相对路径根据当前文件位置计算索引找到文件位置,非相对位置模块导入编译器会从包含导入的文件目录开始一次向上级目录遍历,尝试匹配到对应的文件。

.d.ts 文件的用法以及相关内容

在TypeScript中,.d.ts文件通常用来定义 JavaScript 库或模块的类型声明。它们是用于描述已存在的JavaScript代码的类型信息的文件,主要描述JavaScript 模块的结构(导出类的参数类型,函数签名格式等)目的是方便在ts代码中进行类型检查和智能感知提醒。当使用TypeScript编写代码时,可以使用类型声明文件来获得对JavaScript库或模块的类型检查和智能感知支持。这些声明文件通常以.d.ts为扩展名。

通过引入适当的类型声明文件,可以有以下帮助:

  1. 类型检查:类型声明文件允许TypeScript编译器验证代码与声明文件中定义的类型是否匹配。这有助于在开发过程中捕获潜在的类型错误,并提供更强大的静态类型检查。
  2. 智能感知:类型声明文件为编辑器提供了有关库或模块的类型信息,从而提供了智能感知功能。这使得在编写代码时能够获得自动完成、参数提示和文档等功能,以增加开发效率。
  3. 文档化:类型声明文件还可以作为库或模块的文档。通过查看类型声明文件,可以了解库的可用函数、类、接口和类型等详细信息,从而更好地理解和使用它们。

案例,定义一个 worker 来实现 ThreeJS 中数据的处理:

onmessage(params) {
  //
  const data: Block[] = [];
  ... 大量计算

  // 线程计算完成返回
  postMessage({ fragments: data  }, timestamp: params.timestamp);
}
declare module '*?worker' {
  const workerConstructor:{
    new (): Worker
  };

  export default workerConstructor
}
import './worker.d.ts';
import Worker from './worker.ts?worker'

function calculateAllBlocks(threadCount: number) {
  for (let i =0; i< threadCount; i++) {
    const worker = new Worker();
    worker.onmessage = dataParse;
    // 传入参数启动线程进行计算
    worker.postMessage({..., timestamp: performance.now()});
  }
}

function dataParse(workerEvent: MessageEvent) {
  // 处理线程返回数据
}

这样我们能快速定义一个 worker.ts 线程处理模块代码,而不需要定义成js再作为参数传递进去加载执行。 main.ts 模块中使用了 Worker 类型也都合法, 原因就是导入了 worker.d.ts 来进行类型解释。 worker.d.ts 中使用了一个后缀模块声明通配符也就是“?worker”,只有在导出模块上加上能通过校验的前后缀才能正确的匹配上(注意main.ts 中的导入)。TS中声明通配符只有在导出的时候使用了匹配上的后缀才会使用对应的类型来进行解释目标模块 。*

本文由mdnice多平台发布

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容