在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
注:本文提及到的代码示例下载地址 - Runnable sample to introduce Typescript 2.0 RC new features
作为一个Javascript的超集, TypeScript是微软继C#后最受人瞩目的明星语言, 日前TypeScript2.0候选版已于八月底发布,正式版也很快很快的要出来了。 废话少说,使用TypeScript 2.0候选版(RC)的第一步,你需要先下载 TypeScript 2.0 RC for Visual Studio 2015 (VS Update 3,VS Update 3, VS Update 3!重要的事情说三遍,一切一切的前提是你必须先安装VS Update 3), 通过NuGet 或者 npm安装: npm install -g typescript@rc
号外:Visual Studio Code用户可以根据这个步骤使用候选版。免费广告:这里我要强烈推荐VS Code,好东东啊,有超越宇宙第一IDE VS的趋势。啥Atom啊, notepad啊, 都可以丢一边去了! 基本上候选版(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定义了一个中间变量c和sq,仅仅为了使得代码简洁并容易理解一些。
但到了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会是啥东东?
更多的字面量(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 of users!", 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' return currentText + action.text; } else { // 'action' has type 'EraseAction' return currentText.slice(0, -action.numChars); } }
全局(Globs)、包含(Includes)、例外(Excludes)当我们曾经第一次介绍tsconfig.json文件的时候,很多用户抱怨人工的列出文件是一件很痛苦的事情。TypeScript 1.6介绍了exclude字段从而略微减轻一些这方面的痛苦。尽管如此,大伙普遍认为这还是不够的。写出所有的单个文件的路径是件很麻烦的事情,而且当你忘记排除一些新文件的时候运行就会出问题。
{ "include": [ "./src/**/*.ts" ], "exclude": [ "./src/tests/**" ] } TypeScript的globs支持以下通配符:
下一个阶段就像我们之前说的,TypeScript 2.0很快会到来,但是单独的尝试玩玩带2.0正式新特性的RC版本将帮助我们更好的倾听开发者社区的声音。有任何问题,我们欢迎你去GitHub告诉我们。
这篇博客大体介绍了一些TypeScript 2.0 RC版本的新特性,为了让大家切身体会一下这些功能,我们提供了一个可以运行的代码下载示例,供大家下载、学习使用。
代码示例下载地址:Runnable sample to introduce Typescript 2.0 RC new features 原文连接:https://blogs.msdn.microsoft.com/typescript/2016/08/30/announcing-typescript-2-0-rc/ 注意及申明:本文大体是全文翻译。少数废话部分是基于我个人的理解,在原文的基础略作增删。 |
请发表评论