在“选择”映射类型的定义中令人困惑的扩展关键字

时间:2018-07-26 19:09:54

标签: typescript

类型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上不存在的键作为第二个参数,那么我们如何从第一个参数中选取呢?

1 个答案:

答案 0 :(得分:1)

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

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

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

'prop' extends string

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

number extends number | string

同样,限制性更强的类型被认为扩展了更为通用的类型。前进到ing文字的并集,由此得出的关系也将是真的

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

但是由于keyof T是所有字符串文字类型的并集,以表示K必须比keyof T更具约束性,因此我们应该写

 K extends keyof T

这将使K成为表示T属性的字符串文字类型并集中的一种类型。

我们不仅限于一个键,因为这种关系也成立:

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

由于左侧的并集更具限制性,所以该关系为真,因此我们可以使用Pick来选择一个以上的属性

相关问题