// TypeScript 是JavaScript的“超集” //

// 前端语言中冉冉升起的新星 //

TypeScript是一种由微软开发的、开源的编程语言,近两年发展迅猛,越来越多的JavaScript项目正在迁移到TypeScript,主流前端框架及Node.js对TypeScript的支持也越来越友好。自2012年10月发布首个公开版本以来,它已得到了人们的广泛认可。

TypeScript发展至今,已经成为很多大型项目的标配,其提供的静态类型系统,大大增强了代码的可读性及可维护性;同时,它提供最新的和不断发展的JavaScript特性,能让我们构建更健壮的组件。

然而在TypeScript中,有些地方对“开箱即用”进行了限制,例如当使用一个未被声明过的变量时(当然,你可以为外部系统使用声明文件)。也就是说,传统的编程语言在类型系统允许与不允许之间存在明显的边界。

TypeScript不同于传统的编程语言,它可以让你自己设置类型系统的边界。这实际上是为了让你能够使用你喜欢的JavaScript,并尽可能安全地使用它。

在TypeScript中,有很多选项都可以精确地控制此边界,下文选自《深入理解TypeScript》一书,现在就让我们去了解它们吧。

▼▼▼

选项为boolean的compilerOptions,可以被指定为tsconfig.json下的compilerOptions。

{"compilerOptions": {"someBooleanOption": true}
}

或者使用命令行。

tsc --someBooleanOption

▼▼▼

有些代码无法被推断,或者推断它们可能会导致意外的错误。一个很好的例子就是函数参数,如果没有对它们进行注解,那么你将不清楚哪些是有效的。

functionlog(someArg) {sendDataToServer(someArg);
}
// 参数是什么,下面哪个是不正确的
log(123);
log('hello world'); 

因此,如果你没有注解函数的参数,TypeScript将会认为它是any类型的,并将继续执行。在这种情况下,将会关闭类型检查,这是JavaScript开发人员所期望的。但是这可能会让那些对安全性要求较高的人措手不及。因此,这里有一个noImplicitAny选项,当开启这个选项时,它将会标记无法被推断的类型的情况,如下所示。

functionlog(someArg) {// 错误:someArg是any类型的sendDataToServer(someArg);
}

当然,你可以继续进行注解。

functionlog(someArg: number) {sendDataToServer(someArg);
} 

如果真的想抛弃安全性,你可以把它标记为any。

functionlog(someArg: any) {sendDataToServer(someArg);
} 

▼▼▼

在默认情况下,null和undefined可以被赋值给TypeScript中的所有类型。

let foo: number = 123;
foo = null;        // 可以
foo = undefined; // 可以

这顺应了大多数编写JavaScript的人的习惯。但是,同时TypeScript允许你明确指出可以分配给null/undefined的内容。

在严格的null检查模式下,null和undefined是不同的。

let foo = undefined;
foo = null;        // 不可以 

假设有一个接口Member,如下所示。

interface Member {name: string,age?: number
}

并不是所有的Member都会提供年龄,所以age是一个可选属性,也就是说age的值可能为undefined。

undefined是“万恶之源”,它通常会导致运行时错误。(编写在运行时抛出错误的代码很容易。)

getMember().then(member: Member =>{conststringifyAge = member.age.toString()//toString属性可能undefined}) 

但是在严格的null检查模式下,这个错误将会在编译时被捕获。

getMember().then(member: Member =>{conststringifyAge = member.age.toString() // 对象可能undefined}) 

◆ 非空断言操作符

在一个类型检查无法得出结论的上下文中,一个新的!表达式后缀操作符,可以用来断言运算对象是非null和非undefined的,示例如下。

 // 用--strictNullChecks进行编译functionvalidateEntity(e?:  Entity) {// 如果e是null或其他无效的实体,则抛出错误}functionprocessEntity(e?: Entity) {validateEntity(e);let a = e.name;        // 错误:e可能是nulllet b = e!.name;       // 可以,我们已经断言e是非null
} 

注意,它只是一个断言,就像类型断言一样,你需要确保该值不为空。一个非null的断言实质上意味着你在告诉编译器“我知道它不是null,但是请让我使用它,即使它不是null”。

◆ 明确赋值断言操作符

TypeScript将会对类中未初始化的属性抛出错误。

class C {foo: number;                  // 可以,已经在构造器中初始化bar: string = "hello";      // 可以,已经初始化baz: boolean;               // 错误:属性baz没有初始化,也没有在构造器中被赋值constructor() {this.foo = 42;}
} 

你可以使用明确赋值断言,在属性名后加后缀,来告诉TypeScript你已经在其他地方(不是在构造器中)对它进行了初始化。

class C {foo!: number;           // 注意这个感叹号// 这是明确赋值断言操作符constructor() {this.initialize();}initialize() {this.foo = 0;}
} 

你也可以将此操作符与变量声明一起使用。

let a: number[];           // 没有断言
let b!: number[];             // 断言initialize();a.push(4);                   // 错误:变量在赋值之前被使用
b.push(4);                   // 可以:因为被断言functioninitialize() {a = [0,1,2,3];b = [0,1,2,3];
} 

就像所有的断言一样,你在告诉编译器让它相信你,让编译器不再抛出错误,即使代码并没有被分配属性。

作为JavaScript的“超集”,TypeScript静态类型检查让我们能轻松地构建和维护大型的前端项目。《深入理解TypeScript》一书是 TypeScript Deep Dive 的中文版,全面阐述了TypeScript的各种“魔法”,示例丰富,简单易懂,并且对初学者非常友好!

本书从实际应用场景出发,对TypeScript语言进行深度剖析,并结合代码示例讲解了诸多TypeScript高级编程技巧,以及在实际开发工作中的最佳实践方案,能帮助读者更加透彻地理解TypeScript。

█ 与官方文档相比,本书主要有以下几个特点

  1. 知识点全面。本书不仅涵盖了官方文档的大部分知识点,对于官方文档中没有却经常遇到的知识点,也做了细致的讲解。
  2. 示例丰富,简单易懂。书中的例子,大都来自作者对日常工作的总结,我们甚至可以直接将它们用于自己的开发工作。
  3. 深入编译原理。在与TypeScript编译原理相关的章节中,本书对如何把TypeScript编译为JavaScript做了详尽的解析。

█ 关 于 作 译 者

Basarat Ali Syed

TypeScript专家,微软JavaScript/TypeScript的MVP贡献者。他是TypeScript社区受人尊敬的成员,澳洲Picnic software高级开发人员,在DefinitelyTyped团队工作。Basarat经常参加澳大利亚与前端开发技术有关的会议,在多个技术活动中做过演讲。Basarat还著有Beginning Node.js 一书,目前该书已被下载39000多次,在亚马逊、豆瓣等平台得到了读者的一致好评。

郭文超:TypeScript深度爱好者,常用笔名三毛,公众号 FENews 主要维护者。曾在 TutorABC、eBay 任职,目前在千寻位置担任前端工程师。对 TypeScript、React、Vue 等有较深理解。

何小磊:山西能快科贸CTO,有十年以上软件开发经验。

柳星:TypeScript 重度用户,常用网名 S1ngS1ng,是 freeCodeCamp 中文社区的维护者之一。曾在 Rackspace、VMware、Apple 任前端工程师一职。

徐野:携程AI研发部前端工程师。热爱大前端,爱折腾新鲜技术,精通 TypeScript、React、Node 等前端技术。

█ 目 录 结 构

  • 第1章 为什么要使用TypeScript
  • 第2章 JavaScript常见语法
  • 第3章 JavaScript 新语法特性
  • 第4章 TypeScript项目构成
  • 第5章 快速创建TypeScript项目
  • 第6章 TypeScript类型系统
  • 第7章 关于 JSX
  • 第8章 TypeScript编译选项设置
  • 第9章 TypeScript错误处理
  • 第10章 开发与测试工具
  • 第11章 提示与建议
  • 第12章 TypeScript代码风格指南与代码约定
  • 第13章 TypeScript编译原理

点击此处了解本书详情

本文由博客一文多发平台 OpenWrite 发布!

作为JavaScript的“超集”,感受一下TypeScript 的那些黑魔法相关推荐

  1. React仿CNode社区(感受React + Typescript + Redux开发流程)

    CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究 GitHub 在线体验地址 说明 使用 React编写,感受React + Typescript + ...

  2. 在线 html 改成jsx,JSX · TypeScript中文网 · TypeScript——JavaScript的超集

    介绍 JSX是一种嵌入式的类似XML的语法. 它可以被转换成合法的JavaScript,尽管转换的语义是依据不同的实现而定的. JSX因React框架而流行,但也存在其它的实现. TypeScript ...

  3. C# 的Timer 在javascript中的实现--基于Typescript

    class Timer {//js 内置的timer对象 private _jsInnerTimerObj: any;private _enable: boolean;private _handler ...

  4. TypeScript和JavaScript的区别,全面解读超详细

    TypeScript 是 JavaScript 的超集,理解 TypeScript 与 JavaScript 区别以选择合适的语言. 1.TypeScript 特性 TypeScript 是 Micr ...

  5. TypeScript中怎么用接口(interface)描述类(静态部分与实例部分)

    TypeScript是JavaScript的超集 在看TypeScript官方文档的接口一节的时候对于类的静态部分与实例部分产生了疑问,通过努力得到自认为相对合理的解释,写下此文以记所得,如有谬误感谢 ...

  6. TypeScript 令我苦不堪言

    作者 | Ilya Suzdalnitski 责编 | 弯月 出品 | CSDN(ID:CSDNnews) 你是否被 TypeScript 的炒作假象所欺骗?TypeScript 真比 JavaScr ...

  7. TypeScript免费视频图文教程(2W字)

    00. B站视频观看地址 出这个教程也是为了迎接Vue3的推出,今晚更新最后一集视频后,开始更新Vue3视频. 01.TypeScript 简介和课程介绍 我原本准备更新 Vue3.x 教程的,由于官 ...

  8. frontend -- Typescript

    类 · TypeScript中文网 · TypeScript--JavaScript的超集 (tslang.cn) Typescript和Javascript的区别? Typescript面试题 - ...

  9. 简单探讨JavaScript 与 TypeScript之间的联系

    这篇文章主要介绍了 JavaScript 与 TypeScript之间的联系,JavaScript,也称为 JS,是一种符合 ECMAScript 规范的编程语言.这是一个高级别的.通常是即时编译的. ...

  10. JavaScript 爆红后,微软为何还要开发 TypeScript?

    开源 TypeScript 在经历过最初微软的内部抵制后,如今终于成长为构建 Web 应用程序的首选语言. 作者 | Liam Tung 译者 | 弯月,责编 | 屠敏 头图 | CSDN 下载自东方 ...

最新文章

  1. python爬虫抖某音爬取视频 Airtest+fiddler
  2. 【题解】 bzoj4472: [Jsoi2015]salesman (动态规划)
  3. hdu 1568 Fibonacci 对数。。
  4. Shell 变量的操作方法
  5. hibernate配置详情2(Dept.hbm.xml)
  6. 19 CO配置-控制-产品成本控制-产品成本计划编制-定义日期控制
  7. 树莓派 Learning 002 装机后的必要操作 --- 03 替换软件源
  8. 11、Jsp加强/EL表达式/jsp标签
  9. php 支持泛型,PHP对Java样式类的泛型有答案吗?
  10. C语言国二上机题库,【高分飘过】2013年国二C语言上机题库(必备完美版).doc
  11. word 多级列表标题设置
  12. 一文读懂电子罗盘的原理、校准和应用
  13. ubuntu使用Firefox无法播放视频
  14. System.arraycopy()方法详解-jdk1.8
  15. 如何解决 Apple ID 验证失败,无法正常使用?
  16. 网店三大要素:产品、运营与品牌
  17. Linux——根目录结构
  18. 2022朝花夕拾-持续快速成长
  19. 配置文件报错 Cannot convert value of type ‘java.lang.String‘ to required type ‘javax.sql.DataSource‘ for p
  20. 怎样进行https证书检查

热门文章

  1. DbVisualizer的Driver连接Oracle Thin选项不可选
  2. 关于C#语言中的集合
  3. .NET与SAP的来往(转)
  4. helvetica字体未嵌入问题
  5. Linux操作系统中修改hostname
  6. [bzoj1791][ioi2008]Island 岛屿(基环树、树的直径)
  7. 单生产者/单消费者 的 FIFO 无锁队列
  8. 基准对象object中的基础类型----元组 (五)
  9. weixin-api生成二维码
  10. javascript动画效果之多物体透明度