模板字符串
TypeScript 现在支持 ES6 模板字符串. 现在可以方便地在字符串中嵌入任何表达式:
var name = "TypeScript";
var greeting = `Hello, ${name}! Your name has ${name.length} characters`;
当编译到 ES6 以前的版本时, 字符串会被分解为:
var name = "TypeScript!";
var greeting = "Hello, " + name + "! Your name has " + name.length + " characters";
类型收窄
在 JavaScript 中常常用 typeof
或者 instanceof
在运行时检查一个表达式的类型. TypeScript 现在理解这些条件, 并且在 if
语句中会据此改变类型接口.
使用 typeof
来检查一个变量:
var x: any = /* ... */;
if(typeof x === 'string') {
console.log(x.subtr(1)); // 错误, 'subtr' 在 'string' 上不存在
}
// 这里 x 的类型依然是 any
x.unknown(); // 正确
与联合类型和 else
一起使用 typeof
:
var x: string | HTMLElement = /* ... */;
if (typeof x === 'string') {
// x 如上所述是一个 string
} else {
// x 在这里是 HTMLElement
console.log(x.innerHTML);
}
与类和联合类型一起使用 instanceof
:
class Dog { woof() { } }
class Cat { meow() { } }
var pet: Dog | Cat = /* ... */;
if (pet instanceof Dog) {
pet.woof(); // 正确
} else {
pet.woof(); // 错误
}
类型别名
现在你可以使用 type
关键字为类型定义一个别名:
type PrimitiveArray = Array<string | number | boolean>;
type MyNumber = number;
type NgScope = ng.IScope;
type Callback = () => void;
类型别名和它们原来的类型完全相同; 它们仅仅是另一种表述的名称.
const enum
(完全内联的枚举)
枚举非常有用, 但有的程序可能并不需要生成的代码, 而简单地将枚举成员的数字值内联能够给这些程序带来一定好处. 新的 const enum
声明在类型安全上和 enum
一致, 但是编译后会被完全抹去.
const enum Suit { Clubs, Diamonds, Hearts, Spades }
var d = Suit.Diamonds;
编译为:
var d = 1;
如果可能 TypeScript 现在会计算枚举的值:
enum MyFlags {
None = 0,
Neat = 1,
Cool = 2,
Awesome = 4,
Best = Neat | Cool | Awesome
}
var b = MyFlags.Best; // 输出 var b = 7;
--noEmitOnError
命令行选项
TypeScript 编译器的默认行为会在出现类型错误 (比如, 尝试赋值一个 string
给 number
) 时依然输出 .js 文件. 在构建服务器或者其他只希望有 “干净” 版本的场景可能并不是期望的结果. 新的 noEmitOnError
标记会使编译器在有任何错误时不输出 .js 代码.
对于 MSBuild 的项目这是目前的默认设定; 这使 MSBuild 的增量编译变得可行, 输出仅在代码没有问题时产生.
AMD 模块名称
AMD 模块默认生成是匿名的. 对于一些像打包工具这样的处理输出模块的工具会带来一些问题 (比如 r.js).
新的 amd-module name
标签允许传入一个可选的模块名称给编译器:
//// [amdModule.ts]
///<amd-module name='NamedModule'/>
export class C {
}
这会在调用 AMD 的 define
方法时传入名称 NamedModule
:
//// [amdModule.js]
define("NamedModule", ["require", "exports"], function (require, exports) {
var C = (function () {
function C() {
}
return C;
})();
exports.C = C;
});