加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

TypeScript 中高级应用与完美实践

发布时间:2019-08-01 17:03:16 所属栏目:移动互联 来源:AlloyTeam
导读:当我们讨论 TypeScript 时,我们在讨论什么? TypeScript 的定位 JavaScript 的超集 编译期行为 不引入额外开销 不改变运行时行为 始终与 ESMAScript 语言标准一致 (stage 3 语法) TypeScript 中的 Decorator 较为特殊,为 Angular 团队和 TypeScript 团队
副标题[/!--empirenews.page--]

当我们讨论 TypeScript 时,我们在讨论什么?

TypeScript 的定位
  • JavaScript 的超集
  • 编译期行为
  • 不引入额外开销
  • 不改变运行时行为
  • 始终与 ESMAScript 语言标准一致 (stage 3 语法)

TypeScript 中高级应用与完美实践

TypeScript 中的 Decorator 较为特殊,为 Angular 团队和 TypeScript 团队交易的结果,有兴趣可自行搜索相关资料。而且近期 EcmaScript 规范中的 decorator 提案内容发生了剧烈变动,建议等此语法标准完全稳定后再在生产项目中使用。

本文只讨论图中蓝色部分。

类型的本质是契约

JSDoc 也能标注类型,为什么要用 TypeScript?

  • JSDoc 只是注释,其标注没有约束作用
  • TS 有—checkJs 选项,但不好用

TypeScript 中高级应用与完美实践

TS 会自动推断函数返回值类型,为什么要多此一举标注出来?

  • 契约高于实现
  • 检查返回值是否写错
  • 写 return 时获得提醒

TypeScript 中高级应用与完美实践

开始之前

几组 VSCode 快捷键

  • 代码补全 control + 空格 ctrl + 空格
  • 快速修复 command + . ctrl + .
  • 重构(重命名) fn + f2 f2

一个网站

TypeScript Playground

初始化项目

自行配置

  1. "compilerOptions": { 
  2.     "esModuleInterop": true, 
  3.     "allowSyntheticDefaultImports": true, 
  4.     "noImplicitAny": true, 
  5.     "strictNullChecks": true, 
  6.     "noImplicitThis": true, 
  7.     "moduleResolution": "node" 
  8.   

react 项目运行 create-react-app ${项目名} —scripts-version=react-scripts-ts

小试牛刀

&和 | 操作符

虽然在写法上,这两个操作符与位运算逻辑操作符相同。但在语义上,它们与位运算刚好相反。

位运算的表现:

  1. 1001 | 1010 = 1011    // 合并1 
  2. 1001 & 1010 = 1000    // 只保留共有1 

在 TypeScript 中的表现:

  1. interface IA { 
  2.     a: string 
  3.     b: number 
  4.   
  5. type TB = { 
  6.     b: number 
  7.     c: number[] 
  8.   
  9. type TC = IA | TB;    // TC类型的变量的键只需包含ab或bc即可,当然也可以abc都有 
  10. type TD = IA & TB;    // TD类型的变量的键必需包含abc 

对于这种表现,可以这样理解: & 表示必须同时满足多个契约, | 表示满足任意一个契约即可。

interface 和 type 关键字

interface 和 type 两个关键字因为其功能比较接近,常常引起新手的疑问:应该在什么时候用 type,什么时候用 interface?

interface 的特点如下:

  • 同名 interface 自动聚合,也可以和已有的同名 class 聚合,适合做 polyfill
  • 自身只能表示 object/class/function 的类型

建议库的开发者所提供的公共 api 应该尽量用 interface/class,方便使用者自行扩展。举个例子,我之前在给腾讯云 Cloud Studio 在线编辑器开发插件时,因为查阅到的 monaco 文档是 0.15.5 版本(当时的最新版本)的,而 Cloud Studio 使用的 monaco 版本为 0.14.3,缺失了一些我需要的 API,所以需要手动 polyfill 一下。

  1. /** 
  2.  * Cloud Studio使用的monaco版本较老0.14.3,和官方文档相比缺失部分功能 
  3.  * 另外vscode有一些特有的功能,必须适配 
  4.  * 故在这里手动实现作为补充 
  5.  */ 
  6. declare module monaco { 
  7.   interface Position { 
  8.     delta(deltaLineNumber?: number, deltaColumn?: number): Position 
  9.   } 
  10.   
  11. // monaco 0.15.5 
  12. monaco.Position.prototype.delta = function (this: monaco.Position, deltaLineNumber = 0, deltaColumn = 0) { 
  13.   return new monaco.Position(this.lineNumber + deltaLineNumber, this.column + deltaColumn); 
  14.   

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读