
文档教程【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址https://gitcode.com/gh_mirrors/typ/typescript-book点击查看免费下载命名空间Namespace是 TypeScript 中组织代码的核心机制之一它把相关代码封装进逻辑容器避免全局命名冲突并通过export关键字控制对外可见性。本文以《The Concise TypeScript Book》本仓库website/src/content/docs/de-de/book/namespacing.md及其英文原文为主题骨架结合仓库内 getting-started-with-typescript.md、exploring-the-type-system.md 等章节从基本语法、导出规则、编译产物、模块与命名空间的取舍到 TypeScript 6.0/7.0 的语法变迁给出可直接复制的实战代码与配置。1. 什么是 Namespace逻辑容器与命名隔离在 TypeScript 中namespace命名空间用于把代码组织进逻辑容器实现三个目标避免命名冲突多个开发者、多个模块中相同名字的类、接口、函数不会互相覆盖分组相关代码把同一业务域的接口、类型、函数放在一起增强可读性控制可见性通过export关键字精确决定哪些成员对外开放。这一点在原文档website/src/content/docs/de-de/book/namespacing.md中有明确表述命名空间用于把代码组织进逻辑容器、避免命名冲突并为相关代码分组使用export关键字可以从模块外部访问命名空间。历史上 TypeScript 曾使用module关键字声明命名空间后来为避免与 ES Module 混淆而改用namespace。从 TypeScript 6.0 起module关键字在 namespace 声明中的用法已被弃用并在 TypeScript 7.0 中成为硬错误hard error详见仓库文档 getting-started-with-typescript.md 中列出的“弃用转硬错误”清单。因此新代码应统一使用namespace。2. 基本语法与导出机制2.1 声明一个命名空间原文档给出了最小完整示例export namespace MyNamespace { export interface MyInterface1 { prop1: boolean; } export interface MyInterface2 { prop2: string; } } const a: MyNamespace.MyInterface1 { prop1: true, };要点拆解namespace MyNamespace { ... }声明名为MyNamespace的命名空间内部的interface必须用export标记否则对外部不可见——命名空间的成员默认是私有的使用MyNamespace.MyInterface1这种点号限定名访问成员这正是命名空间避免冲突的方式const a变量按结构类型检查被赋予prop1: boolean的值符合 interface-and-type.md 中所述 TypeScript 的结构化类型系统。2.2 export 是唯一出口export关键字在命名空间中的语义与模块导出一致导出的接口、类型、函数、变量可被命名空间外部通过限定名访问未导出的成员仅能在命名空间内部互相引用外部无法访问。因此原文档强调“export关键字允许从模块外部访问命名空间”——这里的“模块”既指 ES Module也指普通的.ts源文件。3. 嵌套命名空间与别名命名空间可以嵌套形成层级化的逻辑容器export namespace Company { export namespace HR { export interface Employee { id: number; name: string; } } } const e: Company.HR.Employee { id: 1, name: Ada };当限定名过长时可以用import别名缩短访问路径注意这里的import是命名空间内部的限定名导入不会产生运行时模块导入import Employee Company.HR.Employee; const e2: Employee { id: 2, name: Grace };4. 命名空间在运行时如何编译IIFE 与作用域理解命名空间的关键在于理解其编译产物。下面的代码export namespace MyNamespace { export interface MyInterface1 { prop1: boolean; } }经tsc编译对应仓库 getting-started-with-typescript.md 中npx tsc/yarn tsc的编译方式后接口声明因为只是类型会被完全擦除命名空间的运行时形态是一个立即执行函数IIFE创建的全局对象use strict; var MyNamespace; (function (MyNamespace) { })(MyNamespace || (MyNamespace {}));所有成员被挂载为 IIFE 内部对象的属性多个文件声明同名命名空间时TypeScript 会自动做声明合并把MyNamespace不断扩展这也解释了 merging-and-extension.md 中“声明合并”的思想在命名空间上的体现命名空间仅存在于脚本script或非模块化上下文中才有全局对象形态当文件包含顶层import/export时它成为模块命名空间则成为模块内部作用域不会污染全局。5. Namespace vs Module如何取舍原文档使用“从模块外部访问命名空间”的措辞暗示了二者的分工。结合 TypeScript 官方语义和本仓库的迁移建议取舍标准如下场景推荐方案理由现代应用、库、组件开发ES Moduleimport/export原生 ECMAScript 标准支持 tree-shaking、依赖分析与动态导入全局脚本、浏览器script场景namespace无需模块加载器直接在全局挂载.d.ts环境声明declare namespacenamespace用于描述已有 JS 库的全局结构见 exploring-the-type-system.md向后兼容老式模块系统AMD/UMD/SystemJS已弃用TypeScript 6.0 弃用、7.0 不再支持见 getting-started-with-typescript.md关键结论在 ESM 时代命名空间主要用于全局环境与声明文件模块化代码优先使用 ES Module。6. Ambient Namespace为已有 JavaScript 库描述类型命名空间在.d.ts声明文件中有特殊用法——declare namespace。仓库 exploring-the-type-system.md 说明环境声明Ambient Declarations是描述 JavaScript 代码类型的.d.ts文件用于为已有 JS 库补充类型。典型写法// library-types.d.ts declare namespace MyLibrary { interface Config { retries: number; } function init(config: Config): void; }然后在业务代码顶部用三斜线指令引用该声明文件参见 triple-slash-directives.md/// reference path./library-types.d.ts / MyLibrary.init({ retries: 3 });这类类型声明可从 DefinitelyTyped 安装npm install --save-dev types/library-name。注意declare仅为类型占位不会产生运行时代码。7. 实战组合示例命名空间 类 函数命名空间不仅能放接口还能放类与函数形成完整的功能单元export namespace Geometry { export interface Point { x: number; y: number; } export function distance(p1: Point, p2: Point): number { return Math.hypot(p2.x - p1.x, p2.y - p1.y); } export class Circle { constructor(public center: Point, public radius: number) {} area(): number { return Math.PI * this.radius ** 2; } } } const c new Geometry.Circle({ x: 0, y: 0 }, 5); console.log(Geometry.distance({ x: 0, y: 0 }, { x: 3, y: 4 })); // 5从源码结构看这类“接口 函数 类”的组合正是命名空间作为“逻辑容器”最典型的使用形态适合小型全局库或需要暴露统一命名前缀的 API。8. 与 TypeScript 6.0/7.0 兼容性提醒结合仓库 getting-started-with-typescript.md 的说明命名空间相关的版本注意点使用namespace关键字本身不受影响继续受支持使用module关键字声明命名空间module X { ... }在 TypeScript 6.0 中被弃用7.0 起为硬错误请迁移为namespace老式模块系统 AMD/UMD/SystemJS 输出在 6.0 弃用、7.0 不再支持这意味着依赖命名空间做运行时模块化的老方案需要迁移到 ESM建议把strict模式打开TypeScript 6.0 起默认开启确保结构类型检查覆盖命名空间内外的所有赋值避免null/undefined进入类型检查盲区见 getting-started-with-typescript.md。9. 小结围绕原文档的核心示例本文完整覆盖了命名空间的五个实践层面声明与导出export namespace 成员级export用点号限定名访问嵌套与别名层级容器与import ... ...缩短路径编译原理接口被擦除运行时形成 IIFE 全局对象支持声明合并场景取舍全局脚本与.d.ts用命名空间模块化代码用 ES Module版本演进module关键字已淘汰统一使用namespace。如需进一步探索可继续阅读本仓库同章节的英文原文 namespacing.md 及目录 table-of-contents.md 中与命名空间相邻的类型系统章节如接口合并、类型扩展。赞分享文档教程【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址https://gitcode.com/gh_mirrors/typ/typescript-book点击查看免费下载相关推荐TypeScript 命名空间Namespacing实战指南用逻辑容器组织代码、杜绝命名冲突TypeScript 命名空间Namespacing实战指南用逻辑容器组织代码、杜绝命名冲突 本篇文章源自开源项目 The Concise TypeScr文档教程TypeScript 命名空间实践指南The Concise TypeScript Book 中的代码组织与命名冲突预防TypeScript 命名空间实践指南The Concise TypeScript Book 中的代码组织与命名冲突预防 在开源项目 The Concise文档教程Kitty 终端快速上手指南分屏、主题与内置 diff 完整玩法Kitty 终端快速上手指南分屏、主题与内置 diff 完整玩法 开着一个窗口跑服务、另一个窗口刷日志还要再切出去看构建输出——窗口切来切去很容易打断思路。桌面应用上一篇Babelify无缝衔接Babel与Browserify的强力工具下一篇TweetNaCl.js 项目推荐创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考