问题描述
不使用 Pick<T, K> ,实现 TS 内置的 Pick<T, K> 的功能。
从类型T
中选出符合K
的属性,构造一个新的类型。
举例
interface Todo {
title: string
description: string
completed: boolean
}
type TodoPreview = MyPick<Todo, 'title' | 'completed'>
const todo: TodoPreview = {
title: 'Clean room',
completed: false,
}
实现
// TypeScript 中,我们可以使用关键字 extends 来进行泛型约束。extends 关键字用于约束泛型类型参数,以确保其是指定类型或其子类型。
// extends 在这里是 约束、限制的含义,不是继承
// keyof 是把 后面 的 键 提取出来组成一个 联合类型
// in 是遍历
/**
* 1、K 增加 泛型约束, 比如,下面有 name、age、height、如果你写一个不在这里面的就会报错
* 2、in 遍历, 冒号右侧,拿到 键 value 类型
*/
type MyPick<T, K extends keyof T> = {
[P in K]: T[P];
};
type Case2 = MyPick<
{ name: string; age: number; height: number },
"name" | "age"
>;
这里就会自动提示
如果填写不符合,那么就会
报错
TS内置方法
Pick<T, K> 是 TypeScript
内置的一个工具类型(Utility Type
),用于从类型 T 中选择指定属性 K 构造出一个新类型
使用 Pick<T, K> 可以实现在一个类型中选择某些属性,然后构造一个新的子类型。它接受两个参数:
- T:指定源类型,即要从中选择属性的类型
- K:指定要选择的属性名,可以是
单个属性名
或属性名组成的联合类型
interface Person {
name: string;
age: number;
address: string;
}
type PersonalInfo = Pick<Person, 'name' | 'age'>;
const person: PersonalInfo = {
name: 'Alice',
age: 25,
};
console.log(person); // 输出:{ name: 'Alice', age: 25 }