[TypeScript] Type Challenges #4 - Pick

96 阅读1分钟

题目描述

不使用 Pick<T, K> ,实现 TS 内置的 Pick<T, K> 的功能。

从类型 T 中选出符合 K 的属性,构造一个新的类型。

例如:

interface Todo {
  titlestring
  descriptionstring
  completedboolean
}

type TodoPreview = MyPick<Todo'title' | 'completed'>

const todoTodoPreview = {
    title'Clean room',
    completedfalse,
}

题解

// ============= Test Cases =============
import type { EqualExpect } from './test-utils'

type cases = [
  Expect<Equal<Expected1MyPick<Todo'title'>>>,
  Expect<Equal<Expected2MyPick<Todo'title' | 'completed'>>>,
  // @ts-expect-error
  MyPick<Todo'title' | 'completed' | 'invalid'>,
]

interface Todo {
  titlestring
  descriptionstring
  completedboolean
}

interface Expected1 {
  titlestring
}

interface Expected2 {
  titlestring
  completedboolean
}

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