关于术语的一点说明: 请务必注意一点,TypeScript 1.5里术语名已经发生了变革。 “内部模块”现在称做“命名空间”。 “外部模块”现在则简称为“模块”,这是为了与 ECMAScript 2015里的术语保持划一,(也就是说 module X { 相称于现在推荐的写法 namespace X {)。
介绍
这篇文章形貌了如安在TypeScript里利用命名空间(之前叫做“内部模块”)来组织你的代码。 就像我们在术语说明里提到的那样,“内部模块”现在叫做“命名空间”。 别的,任何利用 module关键字来声明一个内部模块的地方都应该利用namespace关键字来替换。 这就制止了让新的利用者被相似的名称所迷惑。
第一步
我们先来写一段程序并将在整篇文章中都利用这个例子。 我们定义几个简单的字符串验证器,假设你会利用它们来验证表单里的用户输入或验证外部数据。
所有的验证器都放在一个文件里
- interface StringValidator {
- isAcceptable(s: string): boolean;
- }
- let lettersRegexp = /^[A-Za-z]+$/;
- let numberRegexp = /^[0-9]+$/;
- class LettersOnlyValidator implements StringValidator {
- isAcceptable(s: string) {
- return lettersRegexp.test(s);
- }
- }
- class ZipCodeValidator implements StringValidator {
- isAcceptable(s: string) {
- return s.length === 5 && numberRegexp.test(s);
- }
- }
- // Some samples to try
- let strings = ["Hello", "98052", "101"];
- // Validators to use
- let validators: { [s: string]: StringValidator; } = {};
- validators["ZIP code"] = new ZipCodeValidator();
- validators["Letters only"] = new LettersOnlyValidator();
- // Show whether each string passed each validator
- for (let s of strings) {
- for (let name in validators) {
- let isMatch = validators[name].isAcceptable(s);
- console.log(`'${ s }' ${ isMatch ? "matches" : "does not match" } '${ name }'.`);
- }
- }
复制代码 命名空间
随着更多验证器的参加,我们必要一种本领来组织代码,以便于在记载它们类型的同时还不消担心与其它对象产生命名辩论。 因此,我们把验证器包裹到一个命名空间内,而不是把它们放在全局命名空间下。
下面的例子里,把所有与验证器相关的类型都放到一个叫做Validation的命名空间里。 由于我们想让这些接口和类在命名空间之外也是可访问的,所以必要利用 export。 相反的,变量 lettersRegexp和numberRegexp是实现的细节,不必要导出,因此它们在命名空间外是不能访问的。 在文件末了的测试代码里,由于是在命名空间之外访问,因此必要限定类型的名称,比如 Validation.LettersOnlyValidator。
利用命名空间的验证器
- namespace Validation {
- export interface StringValidator {
- isAcceptable(s: string): boolean;
- }
- const lettersRegexp = /^[A-Za-z]+$/;
- const numberRegexp = /^[0-9]+$/;
- export class LettersOnlyValidator implements StringValidator {
- isAcceptable(s: string) {
- return lettersRegexp.test(s);
- }
- }
- export class ZipCodeValidator implements StringValidator {
- isAcceptable(s: string) {
- return s.length === 5 && numberRegexp.test(s);
- }
- }
- }
- // Some samples to try
- let strings = ["Hello", "98052", "101"];
- // Validators to use
- let validators: { [s: string]: Validation.StringValidator; } = {};
- validators["ZIP code"] = new Validation.ZipCodeValidator();
- validators["Letters only"] = new Validation.LettersOnlyValidator();
- // Show whether each string passed each validator
- for (let s of strings) {
- for (let name in validators) {
- console.log(`"${ s }" - ${ validators[name].isAcceptable(s) ? "matches" : "does not match" } ${ name }`);
- }
- }
复制代码 分离到多文件
当应用变得越来越大时,我们必要将代码分离到差别的文件中以便于维护。
多文件中的命名空间
现在,我们把Validation命名空间分割成多个文件。 尽管是差别的文件,它们仍是同一个命名空间,而且在利用的时候就犹如它们在一个文件中定义的一样。 由于差别文件之间存在依赖关系,所以我们参加了引用标签来告诉编译器文件之间的关联。 我们的测试代码保持不变。
Validation.ts
- namespace Validation {
- export interface StringValidator {
- isAcceptable(s: string): boolean;
- }
- }
复制代码 LettersOnlyValidator.ts
- /// <reference path="Validation.ts" />
- namespace Validation {
- const lettersRegexp = /^[A-Za-z]+$/;
- export class LettersOnlyValidator implements StringValidator {
- isAcceptable(s: string) {
- return lettersRegexp.test(s);
- }
- }
- }
复制代码 ZipCodeValidator.ts
- /// <reference path="Validation.ts" />
- namespace Validation {
- const numberRegexp = /^[0-9]+$/;
- export class ZipCodeValidator implements StringValidator {
- isAcceptable(s: string) {
- return s.length === 5 && numberRegexp.test(s);
- }
- }
- }
复制代码 Test.ts
- /// <reference path="Validation.ts" />
- /// <reference path="LettersOnlyValidator.ts" />
- /// <reference path="ZipCodeValidator.ts" />
- // Some samples to try
- let strings = ["Hello", "98052", "101"];
- // Validators to use
- let validators: { [s: string]: Validation.StringValidator; } = {};
- validators["ZIP code"] = new Validation.ZipCodeValidator();
- validators["Letters only"] = new Validation.LettersOnlyValidator();
- // Show whether each string passed each validator
- for (let s of strings) {
- for (let name in validators) {
- console.log(`"${ s }" - ${ validators[name].isAcceptable(s) ? "matches" : "does not match" } ${ name }`);
- }
- }
复制代码 当涉及到多文件时,我们必须确保所有编译后的代码都被加载了。 我们有两种方式。
第一种方式,把所有的输入文件编译为一个输出文件,必要利用--outFile标志:
- tsc --outFile sample.js Test.ts
复制代码 编译器会根据源码里的引用标签自动地对输出进行排序。你也可以单独地指定每个文件。
- tsc --outFile sample.js Validation.ts LettersOnlyValidator.ts ZipCodeValidator.ts Test.ts
复制代码 第二种方式,我们可以编译每一个文件(默认方式),那么每个源文件都会对应生成一个JavaScript文件。 然后,在页面上通过 <script>标签把所有生成的JavaScript文件按正确的顺序引进来,比如:
MyTestPage.html (excerpt)
- <script src="Validation.js" type="text/javascript" />
- <script src="LettersOnlyValidator.js" type="text/javascript" />
- <script src="ZipCodeValidator.js" type="text/javascript" />
- <script src="Test.js" type="text/javascript" />
复制代码 别名
另一种简化命名空间操作的方法是利用import q = x.y.z给常用的对象起一个短的名字。 不要与用来加载模块的 import x = require('name')语法弄混了,这里的语法是为指定的符号创建一个别名。 你可以用这种方法为任意标识符创建别名,也包括导入的模块中的对象。
- namespace Shapes {
- export namespace Polygons {
- export class Triangle { }
- export class Square { }
- }
- }
- import polygons = Shapes.Polygons;
- let sq = new polygons.Square(); // Same as "new Shapes.Polygons.Square()"
复制代码 注意,我们并没有利用require关键字,而是直接利用导入符号的限定名赋值。 这与利用 var相似,但它还适用于类型和导入的具有命名空间寄义的符号。 重要的是,对于值来讲, import会生成与原始符号差别的引用,所以改变别名的var值并不会影响原始变量的值。
利用其它的JavaScript库
为了形貌不是用TypeScript编写的类库的类型,我们必要声明类库导出的API。 由于大部分程序库只提供少数的顶级对象,命名空间是用来表现它们的一个好办法。
我们称其为声明是由于它不是外部程序的具体实现。 我们通常在 .d.ts里写这些声明。 假如你认识C/C++,你可以把它们当做 .h文件。 让我们看一些例子。
外部命名空间
流行的程序库D3在全局对象d3里定义它的功能。 由于这个库通过一个 <script>标签加载(不是通过模块加载器),它的声明文件利用内部模块来定义它的类型。 为了让TypeScript编译器识别它的类型,我们利用外部命名空间声明。 比如,我们可以像下面如许写:
D3.d.ts (部分摘录)
- declare namespace D3 {
- export interface Selectors {
- select: {
- (selector: string): Selection;
- (element: EventTarget): Selection;
- };
- }
- export interface Event {
- x: number;
- y: number;
- }
- export interface Base extends Selectors {
- event: Event;
- }
- }
- declare var d3: D3.Base;
复制代码 末了
有许多小伙伴不知道学习哪些鸿蒙开发技能?不知道必要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,终极浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。
这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端摆设、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技能、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技能知识点。
盼望这一份鸿蒙学习资料能够给大家带来帮助,有必要的小伙伴自行领取,限时开源,先到先得~无套路领取!!
获取这份完备版高清学习门路,请点击→纯血版全套鸿蒙HarmonyOS学习资料
鸿蒙(HarmonyOS NEXT)最新学习门路
- HarmonOS就业必备技能
- HarmonOS多媒体技能
有了门路图,怎么能没有学习资料呢,小编也预备了一份连合鸿蒙官方发布笔记整理收纳的一套体系性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。
获取以上完备版高清学习门路,请点击→纯血版全套鸿蒙HarmonyOS学习资料
《鸿蒙 (OpenHarmony)开发入门教学视频》
《鸿蒙生态应用开发V2.0白皮书》
《鸿蒙 (OpenHarmony)开发底子到实战手册》
OpenHarmony北向、南向开发环境搭建
《鸿蒙开发底子》
- ArkTS语言
- 安装DevEco Studio
- 运用你的第一个ArkTS应用
- ArkUI声明式UI开发
- .……
《鸿蒙开发进阶》
- Stage模型入门
- 网络管理
- 数据管理
- 电话服务
- 分布式应用开发
- 通知与窗口管理
- 多媒体技能
- 安全技能
- 使命管理
- WebGL
- 国际化开发
- 应用测试
- DFX面向将来计划
- 鸿蒙体系移植和裁剪定制
- ……
《鸿蒙进阶实战》
- ArkTS实践
- UIAbility应用
- 网络案例
- ……
获取以上完备鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料
总结
总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变革,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |