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<>
对象只要部署了 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>接口。
参考链接
相关内容
- 体验 阮一峰最新发布的高质量TypeScript教程。教程适合有JavaScript基础的人系统学习TypeScript,并包含了26个章节的内容,涵盖了TypeSc...
- 自述 这是一本关于TypeScript的教程,由知名作者阮一峰编写。教程介绍了TypeScript的基础知识和用法,并包含了最新的TypeScript 5.0版本的更...
- any 类型,unknown 类型,never 类型 any类型关闭类型检查,unknown类型严格版的any。never类型代表不包含任何值的类型。any和unknown是顶层类型,never是唯一的底层类型。使...
- TypeScript 的数组类型 TypeScript数组成员类型必须相同,用T[]表示。数组类型可推断,readonly使数组成为只读。数组是无边界的,不会越界报错。支持多维数组表示。
- TypeScript 的类型断言 TypeScript的类型断言可以绕过类型检查,as可以断言任意类型,as const可缩小类型范围。非空断言!处理空值,断言函数asserts语句明确参数类型...
- TypeScript 基本用法 TypeScript 基本语法包括类型声明、类型推断、编译成 JavaScript 代码等。使用 tsc 编译器把 TS 代码编译成 JS 代码。tsconfi...