将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
是无效的?
答案 0 :(得分:2)
类型不能存在,每个属性都是联合描述的任意一种情况。
keyof T
没有描述类型T
,而是描述了可能用于获取T
属性的键的类型,即key
的类型。表达式t[key]
中的变量,其中t
的值的类型为T
。毕竟,这是javascript的类型系统,其中属性访问t.propertyName
与稍加完善的t["propertyName"]
完全相同,并且后者始终允许使用包含属性的变量来动态访问对象属性名称。
这是联合类型,因为您可以在t[key]
表达式中使用任何单个键。
文字类型的交集没有意义-类型"name" & "age" & "location"
意味着变量值同时等于所有三个文字值,这是不可能的。在内部,此类交集会减少为never
类型。