ts 高级类型篇

今天翻一翻 typescript 2.1 加入的新特性。

  • keyof 索引类型

  • 映射类型 Partial Record Pick

    Partial

Partial 形容词,译为 部分的/局部的/不完全的。使一个 interface/class 或 其他 k/v 形式的 类型的每一个属性完全可选(难以理解的同学,看下面解释)。

类型声明

1
2
3
4
5
6
/**
* Make all properties in T optional
*/
type Partial<T> = {
[P in keyof T]?: T[P];
};

示例

1
2
3
4
5
6
interface A {
id: number;
name: string;
age: number;
}
type PartialA = Partial<A>;

Record

构造一个具有一组属性 K(类型 T)的类型。

类型声明

1
2
3
4
5
6
/**
* Construct a type with a set of properties K of type T
*/
type Record<K extends keyof any, T> = {
[P in K]: T;
};

示例

1
2
3
4
5
6
7
8
9
import { IncomingMessage, ServerResponse } from "http";

enum Methods {
GET = "get",
POST = "post",
DELETE = "delete",
PUT = "put",
}
type IRouter = Record<Methods, (req: IncomingMessage, res: ServerResponse) => void>;

Pick

从 T 中,选择一组键在并集 K 中的属性。实际就是说在原有的类型 T 上 筛选出想要的全部或极个别的属性和类型

类型声明

1
2
3
4
5
6
/**
* From T, pick a set of properties whose keys are in the union K
*/
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};

示例

1
2
3
4
5
6
7
interface B {
id: number;
name: string;
age: number;
}

type PickB = Pick<B, "id" | "name">;

Omit

作用与Pick相反,Omit是排除一个字段,剩下的所有,
源码:Omit<T, K extends keyof any>

示例

1
2
3
4
5
6
7
interface C {
id: number;
name: string;
age: number;
}

type OmitC = Omit<C, "id">;


个人感觉 keyof、 Record 和 Pick 还是比较实用的,ts 的 每个版本 都会加入一些特性,特性很丰富,个人表示学不动了…

原创技术分享,您的支持将鼓励我继续创作