TS中"Pick"和"Extract"的区别

845c2c38ba0f712d5157da112a9fcba6.png

"Extract"是一个常见的操作,用于从数据结构中获取子集。在TypeScript中,"Extract"是一个工具类型,用于从联合类型中提取特定的类型。以下是其基本用法:

type T = 'a' | 'b' | 'c';


type R = Extract<T, 'a' | 'b'>;  // 'a' | 'b'

在这个例子中,T是一个联合类型,包含'a', 'b', 'c'三种类型。Extract<T, 'a' | 'b'>将从T中提取出'a'和'b',所以R的类型是'a' | 'b'。

在TypeScript中,"Exclude"也是一个工具类型,用于从一个类型中排除出另一个类型。以下是其基本用法:

type T = 'a' | 'b' | 'c';


type R = Exclude<T, 'a' | 'b'>;  // 'c'

在这个例子中,T是一个联合类型,包含'a', 'b', 'c'三种类型。Exclude<T, 'a' | 'b'>将从T中排除出'a'和'b',所以R的类型是'c'。

看到这里可能觉得没什么难的,我们再看下两者的源码。

type Exclude<T, U> = T extends U ? never : T;


type Extract<T, U> = T extends U ? T : never;

在TypeScript中,如果你想要创建一个泛型,该泛型应该被约束为非字符串类型,你可以使用"Exclude"工具类型来排除字符串。以下是一个例子:

type NonString<T> = Exclude<T, string>;


let num: NonString<number | string>; // num can only be number now
num = 123; // OK
num = "123"; // Error: Type 'string' is not assignable to type 'number'.

在这个例子中,NonString是一个新的泛型类型,它从T中排除了字符串类型。因此,当你尝试将一个字符串赋值给num时,TypeScript会抛出一个错误,因为字符串不是NonString<number | string>的一个有效类型。

"Pick"和"Omit"也是工具类型,它们用于从对象类型中选择或排除某些属性。以下是它们的基本用法:

"Pick"用法:

type Todo = {
  title: string;
  description: string;
  completed: boolean;
};


type TodoPreview = Pick<Todo, 'title' | 'completed'>;


let todo: TodoPreview = {
  title: 'Clean room',
  completed: false,
};

在这个例子中,Todo是一个对象类型,包含'title', 'description', 'completed'三个属性。Pick<Todo, 'title' | 'completed'>将从Todo中选择'title'和'completed',所以TodoPreview的类型是 { title: string; completed: boolean; }。

"Omit"用法:

type Todo = {
  title: string;
  description: string;
  completed: boolean;
};


type TodoPreview = Omit<Todo, 'description'>;


let todo: TodoPreview = {
  title: 'Clean room',
  completed: false,
};

在这个例子中,Todo是一个对象类型,包含'title', 'description', 'completed'三个属性。Omit<Todo, 'description'>将从Todo中排除'description',所以TodoPreview的类型是 { title: string; completed: boolean; }。

我们再看下两者的源码。

type Pick<Type, K extends keyof Type> = { [P in K]: Type[P]; }


type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

"Pick"和"Extract"都是工具类型,但它们的用途和工作方式有所不同。总的来说,"Pick"和"Extract"都是用于创建新的类型,但"Pick"是从一个对象类型中选择属性,而"Extract"是从一个联合类型中提取类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值