TypeScript 2.0 RC版的新特性

注:您可以通过如下链接下载本文的代码样例:

Runnable sample to introduce Typescript 2.0 RC new features


作为一个Javascript的超集, TypeScript是微软继C#后最受人瞩目的明星语言, 日前TypeScript2.0候选版已于八月底发布,正式版也很快很快的要出来了。


好,废话不说,使用TypeScript 2.0候选版(RC)的第一步,你需要先下载TypeScript 2.0 RC forVisual Studio 2015 (VS Update 3VS Update 3VS Update 3!重要的事情说三遍,一切一切的前提是你必须先安装VS Update 3)通过NuGet或者 npm安装:

 

npm install -g typescript@rc
 

号外:Visual Studio Code用户可以根据这个步骤使用候选版。这里我要强烈推荐VS Code,好东东啊, 啥Atom,都可以丢一边去了!

基本上候选版(RC)已经无线接近于2.0正式版了,目前微软TypeScript团队通过RC版本广泛的倾听用户的反馈,以保证最终正式版的稳定。根据微软的一贯传统,原则上候选版出来后就不会有太大改动,所以一些修改太大的功能、语法啥的大伙可以提,但不要有太大期望正式版会出来。

由于之前大部分功能在2.0Beta版本已经出来了,所以这次主要说一说RC版本中的一些新的好东东:

标记联合(Tagged Unions)

标记联合是一个非常令人激动的新特性,TypeScript把这种F#,Swift, Rust等语言才有的特性带给了Javascript。标记联合也叫可识别联合,不相交联合或者代数数据类型。不过名字只是一个代号,功能特性才是真正令人觉得意思的事儿。

比方说你定义了两个类型:Circle(圆形) 和Square(正方形)。 然后你定义一个功能类型Shape(形状):


interface Circle{
    kind:"circle";
    radius:number;
}
interface Square{
    kind:"square";
    sideLength: number;
}
type Shape = Circle | Square;

你可能会注意到, Circle 和Square这两个接口都有一个叫kind的字符串String类型的定义。这意味着Circle中kind字段总是包含一个"circle" string类型。 每一个接口类型都有一个共同的字段kind,但是这个字段在两个接口中其各自唯一的不同的值circle和square。

 

在TypeScript 1.8中,我们需要写下面这样的一个函数,从而获取一个形状的面积:

function getArea(shape: Shape) {
    switch(shape.kind) {
        case "circle":
            // Convert from 'Shape' to 'Circle'
            let c =shape as Circle;
            return Math.PI * c.radius ** 2;
case "square":
            // Convert from 'Shape' to 'Square'
            let sq =shape as Square;
            return sq.sideLength ** 2;
    }
}

注意,这里我们为shape定义了一个中间变量csq,仅仅为了使得代码简洁并容易理解一些。

 

但到了TypeScript 2.0, 就完全不必要这样定义啦。TypeScript 2.0可以根据kind字段值来理解如何区别他们,因此你可以这么写:

function getArea(shape: Shape){
    switch(shape.kind) {
        case "circle":
            // 'shape' is a 'Circle' here.
            return Math.PI * shape.radius ** 2;
case "square":
            // 'shape' is a 'Square' here.
            return shape.sideLength ** 2;
    }
}

运行一下,完全不会报错,并且TypeScript可以在每个case的分支使用控件流分析查看shape真实的类型。事实上, 你甚至可以使用--noImplicitReturns 和即将到来的 --strictNullChecks 特性,以确保这些检查是全面的. PS: strictNullChecks会是啥东东?

标记联合特性使得今天的我们可以放心的在使用一些JavaScript模式的时候保证类型安全。比方说,类似Redux的类库在做一些动作时将常常使用这个模式。

 

更多的字面量(Literal)类型


字符串String literal类型曾经是TypeScript 1.8中的一个特性,这个特性非常有用.

不只是string类型,我们曾经确实想为string类型之外的一些类型提供Literal特性。在2.0版本中,每一个唯一的boolean类型, number以及枚举类型将拥有他们自己的Literal类型。撸码:

type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
let nums: Digit[] = [1, 2, 4, 8];
// Error! '16' isn't a 'Digit'!
nums.push(16);
使用标签联合(tagged unions), 我们可以更加自然的表达一些东东:
interface Success<T> {
    success:true;
    value:T;
}
interface Failure{
    success:false;
    reason:string;
}
type Result<T> = Success<T> | Failure;
这里Result<T> 类型说明有的时候结果有可能是失败的。如果成功,它会有一个值;如果失败,会包含一个失败的理由。注意:那个值字段只能在成功的时候使用。
declare function tryGetNumUsers(): Result<number>;
let result= tryGetNumUsers();
if (result.success === true) {
    // 'result' has type 'Success<number>'
    console.log(`Server reported ${result.value} users`);
}
else {
    // 'result' has type 'Failure'
    console.error("Error fetching number ofusers!",result.reason);
}

你可能已经注意到enum的成员也可以得到他们自己的类型。

enum ActionType { Append, Erase }
interface AppendAction { 
    type:ActionType.Append;
    text:string;
}
interface EraseAction {
    type:ActionType.Erase;
    numChars:number;
}
function updateText(currentText: string, action: AppendAction | EraseAction) {
    if(action.type === ActionType.Append) {
        // 'action' has type 'AppendAction'
        returncurrentText + action.text;
    }
    else{
        // 'action' has type 'EraseAction'
        returncurrentText.slice(0, -action.numChars);
    }
}

全局(Globs)、包含(Includes)、例外(Excludes)

当我们曾经第一次介绍tsconfig.json文件的时候,很多用户抱怨人工的列出文件是一件很痛苦的事情。TypeScript 1.6介绍了exclude字段从而略微减轻一些这方面的痛苦。尽管如此,大伙普遍认为这还是不够的。写出所有的单个文件的路径是件很麻烦的事情,而且当你忘记排除一些新文件的时候运行就会出问题。

TypeScript 2.0终于可以支持Globs(全局)啦。 Globs允许你使用通配符设置路径,使得你可以根据你的需要进行配置,从而避免之前冗余而麻烦的例举。

你也可以在已经存在的exclude的字段中使用新的include字段。我们这里举一个列子:不妨运行一下下面的代码进行测试,看是否编译正确:

{
    "include": [
        "./src/**/*.ts"
    ],
    "exclude": [
        "./src/tests/**"
    ]
}

TypeScript的globs支持一下通配符:

  • * 是为数字或者其他的非分隔符字符 (比方说 / 或者 \).
  • ? 是精确匹配一个非分隔符字符 .
  • **/ 是任意数量的子目录

下一个阶段

就像我们之前说的,TypeScript 2.0很快会到来,但是单独的尝试玩玩带2.0正式新特性的RC版本将帮助我们更好的倾听开发者社区的声音。

有任何问题,我们欢迎你去GitHub告诉我们。


这篇博客大体介绍了一些TypeScript 2.0 RC版本的新特性,为了让大家切身体会一下这些功能,我们这两天将提供一个可以运行的代码下载示例,供大家下载、学习使用。期待更新~~

 

原文连接https://blogs.msdn.microsoft.com/typescript/2016/08/30/announcing-typescript-2-0-rc/ 

代码下载: Runnable sample to introduce Typescript 2.0 RC new features

注意及申明:本文大体是全文翻译。少数废话部分是基于我个人的理解,在原文的基础略作增删。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
城市应急指挥系统是智慧城市建设的重要组成部分,旨在提高城市对突发事件的预防和处置能力。系统背景源于自然灾害和事故灾难频发,如汶川地震和日本大地震等,这些事件造成了巨大的人员伤亡和财产损失。随着城市化进程的加快,应急信息化建设面临信息资源分散、管理标准不统一等问题,需要通过统筹管理和技术创新来解决。 系统的设计思路是通过先进的技术手段,如物联网、射频识别、卫星定位等,构建一个具有强大信息感知和通信能力的网络和平台。这将促进不同部门和层次之间的信息共享、交流和整合,提高城市资源的利用效率,满足城市对各种信息的获取和使用需求。在“十二五”期间,应急信息化工作将依托这些技术,实现动态监控、风险管理、预警以及统一指挥调度。 应急指挥系统的建设目标是实现快速有效的应对各种突发事件,保障人民生命财产安全,减少社会危害和经济损失。系统将包括预测预警、模拟演练、辅助决策、态势分析等功能,以及应急值守、预案管理、GIS应用等基本应用。此外,还包括支撑平台的建设,如接警中心、视频会议、统一通信等基础设施。 系统的实施将涉及到应急网络建设、应急指挥、视频监控、卫星通信等多个方面。通过高度集成的系统,建立统一的信息接收和处理平台,实现多渠道接入和融合指挥调度。此外,还包括应急指挥中心基础平台建设、固定和移动应急指挥通信系统建设,以及应急队伍建设,确保能够迅速响应并有效处置各类突发事件。 项目的意义在于,它不仅是提升灾害监测预报水平和预警能力的重要科技支撑,也是实现预防和减轻重大灾害和事故损失的关键。通过实施城市应急指挥系统,可以加强社会管理和公共服务,构建和谐社会,为打造平安城市提供坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值