模板字符串

TypeScript 现在支持 ES6 模板字符串. 现在可以方便地在字符串中嵌入任何表达式:

  1. var name = "TypeScript";
  2. var greeting = `Hello, ${name}! Your name has ${name.length} characters`;

当编译到 ES6 以前的版本时, 字符串会被分解为:

  1. var name = "TypeScript!";
  2. var greeting = "Hello, " + name + "! Your name has " + name.length + " characters";

类型收窄

在 JavaScript 中常常用 typeof 或者 instanceof 在运行时检查一个表达式的类型. TypeScript 现在理解这些条件, 并且在 if 语句中会据此改变类型接口.

使用 typeof 来检查一个变量:

  1. var x: any = /* ... */;
  2. if(typeof x === 'string') {
  3. console.log(x.subtr(1)); // 错误, 'subtr' 在 'string' 上不存在
  4. }
  5. // 这里 x 的类型依然是 any
  6. x.unknown(); // 正确

与联合类型和 else 一起使用 typeof:

  1. var x: string | HTMLElement = /* ... */;
  2. if (typeof x === 'string') {
  3. // x 如上所述是一个 string
  4. } else {
  5. // x 在这里是 HTMLElement
  6. console.log(x.innerHTML);
  7. }

与类和联合类型一起使用 instanceof:

  1. class Dog { woof() { } }
  2. class Cat { meow() { } }
  3. var pet: Dog | Cat = /* ... */;
  4. if (pet instanceof Dog) {
  5. pet.woof(); // 正确
  6. } else {
  7. pet.woof(); // 错误
  8. }

类型别名

现在你可以使用 type 关键字为类型定义一个别名:

  1. type PrimitiveArray = Array<string | number | boolean>;
  2. type MyNumber = number;
  3. type NgScope = ng.IScope;
  4. type Callback = () => void;

类型别名和它们原来的类型完全相同; 它们仅仅是另一种表述的名称.

const enum (完全内联的枚举)

枚举非常有用, 但有的程序可能并不需要生成的代码, 而简单地将枚举成员的数字值内联能够给这些程序带来一定好处. 新的 const enum 声明在类型安全上和 enum 一致, 但是编译后会被完全抹去.

  1. const enum Suit { Clubs, Diamonds, Hearts, Spades }
  2. var d = Suit.Diamonds;

编译为:

  1. var d = 1;

如果可能 TypeScript 现在会计算枚举的值:

  1. enum MyFlags {
  2. None = 0,
  3. Neat = 1,
  4. Cool = 2,
  5. Awesome = 4,
  6. Best = Neat | Cool | Awesome
  7. }
  8. var b = MyFlags.Best; // 输出 var b = 7;

--noEmitOnError 命令行选项

TypeScript 编译器的默认行为会在出现类型错误 (比如, 尝试赋值一个 stringnumber) 时依然输出 .js 文件. 在构建服务器或者其他只希望有 “干净” 版本的场景可能并不是期望的结果. 新的 noEmitOnError 标记会使编译器在有任何错误时不输出 .js 代码.

对于 MSBuild 的项目这是目前的默认设定; 这使 MSBuild 的增量编译变得可行, 输出仅在代码没有问题时产生.

AMD 模块名称

AMD 模块默认生成是匿名的. 对于一些像打包工具这样的处理输出模块的工具会带来一些问题 (比如 r.js).

新的 amd-module name 标签允许传入一个可选的模块名称给编译器:

  1. //// [amdModule.ts]
  2. ///<amd-module name='NamedModule'/>
  3. export class C {
  4. }

这会在调用 AMD 的 define 方法时传入名称 NamedModule:

  1. //// [amdModule.js]
  2. define("NamedModule", ["require", "exports"], function (require, exports) {
  3. var C = (function () {
  4. function C() {
  5. }
  6. return C;
  7. })();
  8. exports.C = C;
  9. });