为什么keyof产生属性的并集而不是属性的交集?

时间:2019-04-21 04:13:53

标签: typescript

keyof与以下类型一起使用将产生union属性名称:

type Person = {
    name: string;
    age: number;
    location: string;
}

type K1 = keyof Person; // "name" | "age" | "location"

类似地,如果我使用利用Omit的{​​{1}}帮助器,则必须为Exclude提供union的属性,而在直观上我会 expect < / em>提供keyof T个要省略的属性,但事实并非如此:

intersection

根据我的理解,我认为以下是type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; type PersonName = Omit<Person, "location" | "age">; // type Person = { name: string } 的组成,因为它需要所有属性的type而不是intersection的所有属性属性:

union

在谈到// This isn't valid, but what I'd expect using keyof type K1 = keyof Person; // "name" & "age" & "location" type PersonName = Omit<Person, "location" & "age">; 时,我对作为keyof的属性键union产生的属性的理解在哪里? }? intersection不存在,每个属性都是type描述的方案。除非它是所有type中正确的union,否则type是无效的?

1 个答案:

答案 0 :(得分:2)

  

类型不能存在,每个属性都是联合描述的任意一种情况。

keyof T没有描述类型T,而是描述了可能用于获取T属性的键的类型,即key的类型。表达式t[key]中的变量,其中t的值的类型为T。毕竟,这是javascript的类型系统,其中属性访问t.propertyName与稍加完善的t["propertyName"]完全相同,并且后者始终允许使用包含属性的变量来动态访问对象属性名称。

这是联合类型,因为您可以在t[key]表达式中使用任何单个键。

文字类型的交集没有意义-类型"name" & "age" & "location"意味着变量值同时等于所有三个文字值,这是不可能的。在内部,此类交集会减少为never类型。