【译】TypeScript 2.2 候选版发布

TypeScript 2.2即将到来,今天我们发布候选版!

如果你是第一次听说TypeScript,那不要紧的,因为TypeScript是一门在JavaScript的基础上添加可选静态类型的语言。基于JavaScript构建,意味着你不需要学习JavaScript以外太多的知识,并且所有现有的代码你也可以使用TypeScript。同时,TypeScript添加的可选类型可以帮助您捕获讨厌的bug,还有通过启用强大的工具支持能提高工作效率。

今天就试试候选版本,你可以使用NuGet获取,或者使用npm运行

npm install -g typescript@rc

您还可以获取Visual Studio 2015的TypeScript版本候选版本(如果已经安装了Update 3)。对其它编辑器的支持得等到我们正式的2.2版本,但你可以看看在Visual Studio CodeSublime Text 3中如何启用更高版本的TypeScript的指南。

为了告诉你新增了哪些特性,这里有几个值得注意的特性来了解此候选版本。

object类型

有些时候,一个API允许你传递除基本类型外任何类型的值。例如,思考Object.create,除非你传递一个对象或null给第一个参数,否则它抛出一个异常。

// 所有这些在运行时都会抛出错误!
Object.create(undefined);
Object.create(1000);
Object.create("hello world");

如果我们试图想出第一个参数的类型,一个简单的方法可能是Object | null。不幸的是,这并不完全奏效。由于结构类型在TypeScript中工作的方式,numberstringboolean都属于Object

为了解决这个问题,我们创建了新的object类型(注意所有这些字母都是小写的!)。
一个更直白的名称可以叫“非基本”类型。

object类型是“空” – 它没有属性,就像{}类型。
这意味着几乎一切都可以分配给object,除了基本类型外。
换句话说,将与numberbooleanstringsymbolnullundefined类型不兼容。

但这意味着我们现在可以正确地将Object.create的第一个参数类型作为object | null

我们预期object基本类型将帮助捕获一大类bug,并更准确地模拟真实世界规范。

我们非常感谢Herrington Darkholme的援手实现这个特性!

改进了对mixins和组合类的支持

mixin模式在JavaScript生态系统中相当常见,在TypeScript 2.2中,我们对语言进行了一些调整,以更好地支持它。

为了做到这一点,我们在TypeScript 2.2中删除了对类的一些限制,就像能够从构造交集类型的值中扩展一样。它还以交集类型上的签名组合的方式调整一些功能。结果是你可以写一个函数

  1. 接受构造函数
  2. 声明一个继承该构造函数的类
  3. 向该新类添加成员
  4. 并返回类本身。

例如,我们可以编写接受一个类的Timestamped函数,并通过添加一个timestamp成员来扩展它。

/** Any type that can construct *something*. */
export type Constructable = new (...args: any[]) => object;

export function Timestamped<BC extends Constructable>(Base: BC) {
 return class extends Base {
 timestamp = new Date();
 };
}

现在我们可以使用任何类通过Timestamped,快速组成一个新的类型。

class Point {
 x: number;
 y: number;
 constructor(x: number, y: number) {
 this.x = x;
 this.y = y;
 }
}

const TimestampedPoint = Timestamped(Point);

const p = new TimestampedPoint(10, 10);
p.x + p.y;
p.timestamp.getMilliseconds();

类似地,我们可以写一个Tagged函数来添加一个tag成员。这些函数实际上使得很容易组合扩展。制作一个带有标签和时间戳的特殊3D点是相当干净的。

class SpecialPoint extends Tagged(Timestamped(Point)) {
 z: number;
 constructor(x: number, y: number, z: number) {
 super(x, y);
 this.z = z;
 }
}

新的JSX生成模式:react-native

在TypeScript 2.1和更早版本中,--jsx编译参数可以使用两个值:

  • preserve 保留JSX语法,并生成.jsx文件。
  • react 将JSX转换为对React.createElement的调用并生成.js文件。

TypeScript 2.2有一个新的JSX生成模式称为react-native,它处于中间位置。在这个方案下,保留JSX语法,但生成.js文件。

这个新模式包含React Native的加载器,它希望所有输入的文件都是.js文件。它既能满足你保留JSX语法又可以从TypeScript获取.js文件的情况。

下一步

我们无法在本篇博客中列出我们工作的一切,你可以在TypeScript Roadmap中看看还有哪些特性。

我们期望您的反馈帮助TypeScript 2.2固定版本的发布!
如果你遇到任何可能的bug,请随时在这里留下反馈,或在GitHub上提出问题