首页 > 解决方案 > 在 Pick 映射类型的定义中混淆 extends 关键字

问题描述

Pick类型的定义是:

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

问题:我们为什么extends在这里使用?在这种情况下,它不是关键字的最佳名称选择吗?extends它应该是这样的exists in

因为extends关键字的名称告诉我,我们将提供的 K 个键作为第二个参数,然后我们扩展 T 的键。所以,基本上我们得到了作为第二个参数提供的 K 个键,加上 T 的所有键。总和将*Length of T* + *amount of K keys*键作为第二个参数。这意味着为第二个参数提供的密钥数量至少与为第一个参数提供的密钥数量相同。如果我们可能有键作为 T 上不存在的第二个参数,我们如何从第一个参数中选择?

标签: typescript

解决方案


Extends 表示在此上下文中对类型的约束。令人困惑的部分可能是围绕什么被认为是扩展什么。

考虑经典 OOP,所有派生类型也是基类型,因此实际上我们可以将更多对象分配给基类型引用而不是派生类型引用,实际上基类型引用比派生类型引用更宽松。

让我们将此逻辑应用于 Typescript 类型,并从string字符串文字类型开始,以下关系为真:

'prop' extends string

更严格的类型扩展了更通用的版本。将相同的逻辑应用于我们得到的联合

number extends number | string

同样,限制性更强的类型被称为扩展了更通用的类型。前进到 sting 文字的联合,这种关系也将是真实的

 'foo' extends 'foo' | 'bar' |'baz'

但是,由于keyof T是所有字符串文字类型的联合,它K必须是一个比keyof T它所遵循的类型更严格的类型,我们应该写

 K extends keyof T

这将实际上使K字符串文字类型联合中的一种类型表示T.

但是,我们不仅限于一个键,因为这种关系也是正确的:

'bar' | 'foo' extends   'bar' | 'foo' |'baz'

由于左侧的并集限制性更强,因此关系为真,我们可以选择多个属性使用Pick


推荐阅读