// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'

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

interface Todo {
  title: string
  description: string
  completed: boolean
}

interface Expected1 {
  title: string
}

interface Expected2 {
  title: string
  completed: boolean
}

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

Pick的用法

type typeA = {
	name: string;
	age: number;
}

type = Pick<typeA, 'name'>

// { name: string }

用索引键 key

用 in 来窄化 key的类型为传入的泛型 K

同时 K 约束为 T 的 键联合类型