TypeScript 的 ES6 类型
Map<K, V>
let map2 = new Map(); // Key any, value any let map3 = new Map<string, number>(); // Key string, value number
TypeScript 使用 Map 类型,描述 Map 结构。
const myMap: Map<boolean,string> = new Map([ [false, 'no'], [true, 'yes'], ]);
Map 是一个泛型,使用时,比如给出类型变量。
由于存在类型推断,也可以省略类型参数。
const myMap = new Map([ [false, 'no'], [true, 'yes'], ]);
Set<T>
Promise<T>
async 函数
async 函数的的返回值是一个 Promise 对象。
const p:Promise<number> = /* ... */; async function fn(): Promise<number> { var i = await p; return i + 1; }
Iterable<T>
对象只要部署了 Iterator 接口,就可以用for...of
循环遍历。Generator 函数(生成器)返回的就是一个具有 Iterator 接口的对象。
TypeScript 使用泛型Iterable<T>
表示具有 Iterator 接口的对象,其中T
表示 Iterator 接口包含的值类型(每一轮遍历获得的值)。
interface Iterable<T> { [Symbol.iterator](): Iterator<T>; }
上面是Iterable<T>
接口的定义,表示一个具有Symbol.iterator
属性的对象,该属性是一个函数,调用后返回的是一个 Iterator 对象。
Iterator 对象必须具有next()
方法,另外还具有两个可选方法return()
和throw()
,类型表述如下。
interface Iterator<T> { next(value?: any): IteratorResult<T>; return?(value?: any): IteratorResult<T>; throw?(e?: any): IteratorResult<T>; }
上面的类型定义中,可以看到next()
、return()
、throw()
这三个方法的返回值是一个部署了IteratorResult<T>
接口的对象。
IteratorResult<T>
接口的定义如下。
interface IteratorResult<T> { done: boolean; //表示遍历是否结束 value: T; // 当前遍历得到的值 }
上面的类型定义表示,Iterator 对象的next()
等方法的返回值,具有done
和value
两个属性。
下面的例子是 Generator 函数返回一个具有 Iterator 接口的对象。
function* g():Iterable<string> { for (var i = 0; i < 100; i++) { yield ''; } yield* otherStringGenerator(); }
上面示例中,生成器g()
返回的类型是Iterable<string>
,其中string
表示 Iterator 接口包含的是字符串。
这个例子的类型声明可以省略,因为 TypeScript 可以自己推断出来 Iterator 接口的类型。
function* g() { for (var i = 0; i < 100; i++) { yield ""; // infer string } yield* otherStringGenerator(); }
另外,扩展运算符(...
)后面的值必须具有 Iterator 接口,下面是一个例子。
function toArray<X>(xs: Iterable<X>):X[] { return [...xs] }
Generator 函数
Generator 函数返回一个同时具有 Iterable 接口(具有[Symbol.iterator]
属性)和 Iterator 接口(具有next()
方法)的对象,因此 TypeScript 提供了一个泛型IterableIterator<T>
,表示同时满足Iterable<T>
和Iterator<T>
两个接口。
interface IterableIterator<T> extends Iterator<T> { [Symbol.iterator](): IterableIterator<T>; }
上面类型定义中,IterableIterator<T>
接口就是在Iterator<T>
接口的基础上,加上[Symbol.iterator]
属性。
下面是一个例子。
function* createNumbers(): IterableIterator<number> { let n = 0; while (1) { yield n++; } } let numbers = createNumbers() // {value: 0, done: false} numbers.next() // {value: 1, done: false} numbers.next() // {value: 2, done: false} numbers.next()
上面示例中,createNumbers()
返回的对象numbers
即具有next()
方法,也具有[Symbol.iterator]
属性,所以满足IterableIterator<T>
接口。