TypeScript系列1

Easter79
• 阅读 525

1. 简介

    随着PC端快速向移动端迁移,移动(体验)优先的概念也越来越响。由于ReactJS目前移动端仅仅支持iOS,因此移动端Web开发框架只能选择: AngularJS/Angula2 + Ionic框架 + Cordova。想要学习好Angula2以及阅读其代码, 就必须了解和学习TypeScript,也因此需要学习好ES6以及Web Component。近期将开始学习TypeScript语言。

    下面先看看TypeScript语言的发展:

    鉴于JavaScript这种脚本语言很难应用于大规模Web应用的开发,微软公司在2012年推出了新的开源编程语言——TypeScript。作为Object Pascal和C#之父Anders Hejisberg的又一作品,TypeScript是JavaScript的超集,但完全兼容JavaScript。相比于JavaScript,TypeScript增加了可选类型、类和模块,扩展了原有的语法,使得代码组织和复用变得更加有序,方便进行大型Web应用的开发。

微软是在2012.11月份将TypeScript语言开源,0.8.1版本是第二个开源的版本[1]。

2014年4月,TypeScript 1.0版本正式发布[2]。之后,微软公司不断更新该语言,陆续推出了1.3、1.4版本。

2015年7月20日TypeScript1.5版本正式发布[3]。

2015年9月2日TypeScript1.6 Beta版本发布[6]。

2. TypeScript 1.5版本新特性

[4]虽然对TypeScript 1.5版本的新特性进行了翻译,但其中一些关键字词上含义偏差较远,而且没有给出举例的代码,下面内容主要是参考[3][4]重新整理的。

首先,在ES6(ECMAScript 6,即ECMAScript 2015)的支持方面。TypeScript 1.5版本增加了对ES6中Modules、Destructuring、Spread、for..of、Symbols、Computed Properties、Let/Const、和Tagged String Templates等新特性的支持。这些新特性使得TypeScript向成为ES6的超集并为ES6的所有主要特性提供类型检查的目标迈进了一大步。

其次,在模块(Module)方面,TypeScript 1.5也进行了很大改动。TypeScript 1.5支持ES6的新模块语法——ES6模块可以用import导入模块并用export导出每一个公共API,甚至可以只导入公共API所需要使用的那部分。

import * as Math from "my/math";
import { add, subtract } from "my/math";

而且,开发人员还可以使用default export声明表示模块的核心内容,从而可以对API做更精确控制。

// math.ts
export function add(x, y) { return x + y }
export function subtract(x, y) { return x – y }
export default function multiply(x, y) { return x * y }

// myFile.ts
import {add, subtract} from "math";
import times from "math";
var result = times(add(2, 3), subtract(5, 3));

在math.ts文件的最后一行用了'export default',这一行可控制这是一个'default' export,当只是用名称而不是用花括号({})来导入具体的exports时就导出这个缺省export,就像myFiles.ts文件的第二行。

此外,TypeScript 1.5对模块进行了简化,并换用更加简洁的名称——内部模块改称为“namespace”,外部模块才为“module”。

由于JavaScript既用于浏览器也用于服务器端,因此TypeScript已经支持将模块编译为AMD或 CommonJS。为了支持更多的JavaScript实践,TypeScript 1.5新增加了两个新的模块输出格式:SystemJS和UMD,其中SystemJS可以使ES6 modules更接近于原生语义(native semantics)而不需要ES6兼容的浏览器引擎,UMD输出单个模块,从而可与AMD和 CommonJS一起配合。

再次,在创建更轻量、可移植的项目方面。鉴于VS Code、Sublime、Atom和其他编辑器已经开始支持tsconfig.json文件,TypeScript 1.5的编译器也开始支持该类型文件,使得用户可以指定工程中的文件和编译选项。该方法创建的项目既可在命令行也可在编辑器中进行开发,更加轻量化。

最后,TypeScript 1.5还添加了ES7中建议的Decorator特性的支持,该特性目前由Angular、Ember和Aurelia团队在合作开发 。由于目前ES7仍然处于开发阶段,其Decorator特性也被视为实验性质。但是,用户目前已经可以进行体验,感受其强大之处。

下面是在Angular 2中使用decorators:

import {Component, View, NgFor, bootstrap} from "angular2/angular2";
import {loadFile} from "audioFile";
import {displayAudioFile} from "displayAudio";

@Component({selector: 'file-list'})
@View({
  template: `  
    <select id="fileSelect" size="5">    
      <option *ng-for="#item of items; #i = index"      
        [selected]="selected === item"(click)="updateSelection()">{{ item }}
      </option>  
    </select>`,  
  directives: [NgFor]
})

class MyDisplay {  
  items: string[];
  
  constructor() {    
    this.items = ["item1", "item2"];  
  }  
  updateSelection() { … }
}

Decorators可以将元数据(metadata)关联到类以及类成员上,并更新那些被装饰的功能。上面代码中,Angular 2使用Decorators来定义类中的HTML selector和template。

3. TypeScript 1.6 Beta版本新特性

React中采用JSX语法编写DOM和native component,但JSX语法与TypeScript中的映射(cast)语法冲突。

为了支持React/JSX, TypeScript从1.6版本开始引入一个新的.tsx文件后缀,使能TypeScript文件中的JSX,同时采用新的'as'运算符作为映射的缺省方式[6]。

同时,对象检查规则更加严格,例如

var x: { foo: number };
x = { foo: 1, baz: 2 };  // 错误,多了一个property 'baz', 但在1.6版本之前无法检测出

var y: { foo: number, bar?: number };
y = { foo: 1, baz: 2 };  // 错误, 多了一个或拼写错误property 'baz', 但在1.6版本之前无法检测出

另外,提升模块解析,使解析更为自然。还增加支持ES6中类表达式(class expressions),开始支持generators。

  1. 参考资料

[1] Announcing TypeScript 0.8.1, 15 Nov 2012, http://blogs.msdn.com/b/typescript/archive/2012/11/15/announcing-typescript-0-8-1.aspx

[2] Announcing TypeScript 1.0, 2 Apr 2014, http://blogs.msdn.com/b/typescript/archive/2014/04/02/announcing-typescript-1-0.aspx

[3] Announcing TypeScript 1.5, 20 Jul 2015, http://blogs.msdn.com/b/typescript/archive/2015/07/20/announcing-typescript-1-5.aspx

[4] TypeScript 1.5正式发布:深度支持ECMAScript, 2015年7月26日, http://www.infoq.com/cn/news/2015/07/TypeScript-ECMAScript

[5] TypeScript的崛起, 2015年4月13日, http://www.infoq.com/cn/news/2015/04/TypeScript-rise

    英文The Rise of TypeScript? March 30, 2015, http://developer.telerik.com/featured/the-rise-of-typescript/

[6] Announcing TypeScript 1.6 Beta: React/JSX, better error checking, and more, 2 Sep 2015, http://blogs.msdn.com/b/typescript/archive/2015/09/02/announcing-typescript-1-6-beta-react-jsx-better-error-checking-and-more.aspx

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Java修道之路,问鼎巅峰,我辈代码修仙法力齐天
<center<fontcolor00FF7Fsize5face"黑体"代码尽头谁为峰,一见秃头道成空。</font<center<fontcolor00FF00size5face"黑体"编程修真路破折,一步一劫渡飞升。</font众所周知,编程修真有八大境界:1.Javase练气筑基2.数据库结丹3.web前端元婴4.Jav
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k