typescript 内置实用程序类型Pick解释

xriantvc  于 2022-11-26  发布在  TypeScript
关注(0)|答案(1)|浏览(179)

有人能解释一下内置的Pick〈Type,Keys〉是如何工作的吗?
我们有:
1.提货的实施。

type Pick<T,K extends keyof T>={  // (1)
    [P in K]:T[P]                 // (2)
}

1.待办事项对象的接口

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

1.我们的目标

const obj: Pick<Todo,"title">={  // (3)
    title:"Hello",
}

我不知道为什么我们在第一点扩展K?
我们在点#3中有关键字“title”,然后在点#1中有“title”extends keyof Todo
因此,在第二点中,我们在“title”中有[P|“描述”|“已完成”]。
在这种情况下,我们可以使用[P in keyof T]代替,但它当然不起作用。
我需要帮助。

rsaldnfx

rsaldnfx1#

TL; drx 1 m0n1x允许我们定义一个键的并集(K),其可以是T中的密钥总数的缩减子集。因为我们将K约束为extends keyof T,我们还说,键必须存在于T类型的源对象上。(例如,T[P]),在代码的后面部分
在上面的示例中,使用Pick<Todo, 'title'>

  • [K中的P] = 'title'
  • [T键中的P] = 'title' | 'description' | 'completed'

如果我们没有K,我们将无法提供所需的“参数”,而是被迫对T中的所有键执行操作

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

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

interface PickedTodo {
  title: string
}
// equivalent to Pick<Todo, 'title'>
  • T:这是我们的源对象类型(例如Todo),我们将从中提取我们感兴趣的键(及其值类型
  • K extends keyof T:这是我们要提取并应用到目标对象类型(例如PickedTodo)的关键字集(必须存在于源对象类型中)。
  • 这个语法的好处是我们可以指定一个键列表,它是源对象类型键的子集(即不需要所有键)。
  • 这些都是满足K extends keyof Todo的有效联合
  • 'title'
  • 'title' | 'description'
  • 'description' | 'completed'
  • x1米20英寸
  • 等等。
  • [P in K]:简单来说,这读起来像是'对于您提供的并集(K)中存在的每个键(P),执行一些操作'。
  • 这是使我们能够循环对象键的TypeScript方式
  • 在我们的示例中,PickedTodo只有一个键title,即K的值是以下并集:title
  • 这与keyof Todokeyof T)不同,keyof Todokeyof T)是Todo上所有键的并集,即:x1米30英寸
  • T[P]:使用T作为基础,提取每个键P的值的类型
  • 在我们的示例中,我们已经确定了并集K中只有一个键,即title。因此,我们只需要执行一次此Map操作并将其应用于目标对象。
  • 我们的目标对象接收到键title,其关联值为Todo['title']T[P]),我们知道该值为string
  • 因此,生成的对象为interface PickedTodo { title: string; }

相关问题