Skip to content

实现 Pick

351字约1分钟

2022-11-30

题目

Github: Pick

实现 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,
}

解题思路

本题需要使用到 查找类型映射类型

  • 查找类型 允许通过名称从另一个类型中提取一个新的类型。
  • 映射类型 允许将一个类型中的每个属性转换为一个新的类型。

在这个挑战中,需要从 联合(union) K 中取得所有内容,遍历并返回一个仅包含这些键的新的类型。 同时 联合(union) K 仅能包含 T 的键值。

答案

type MyPick<T, K extends keyof T> = {
  [P in K]: T[P]
}

最终结果为,从 K 中获取所有内容,命名为 P 并将其作为新对象的一个新键,其值的类型取自输入类型。

验证

interface Todo {
  
title
: string
description
: string
completed
: boolean
} type
Todo2
=
MyPick
<Todo, 'title' | 'completed'>
type
Test
=
Expect
<
Equal
<
Todo2
, {
title
: string;
completed
: boolean }>>

参考