如何通过 keyof 理解 TypeScript 交集
P粉451614834
2023-09-05 22:37:33
<p><pre class="brush:php;toolbar:false;">interface Person {
name: string;
}
interface Lifespan {
birth: Date;
death: Date;
}
type PersonSpan = Person & Lifespan;
type K = keyof PersonSpan; // type K = "name" | "birth" | "death"
let prop: K = "name"; // ok
let obj: PersonSpan = { // compile error, missing birth and death properties
name: "John Smith"
}</pre>
<p>如果我想通过<code>keyof</code>理解类型交集:</p>
<p>此对象实例的键<code>{ name: "John Smith" }</code> 是<code>name</code>,它与<code>keyof PersonSpan</code> 匹配,即<code> “姓名”| 「出生」 | “death”</code>,执行 <code>let prop: "name" | 是有效的。 「出生」 | “死亡”=“名字”; </code></p>
<p>所以只要对象具有这三个属性之一就应该有效,为什么它仍然需要具有可分配给 <code>PersonSpan</code> 的所有属性?</p>
在 TypeScript 中,当您使用两个或多个类型的交集 & 定义类型时,生成的类型将具有每个交集类型的所有属性。在本例中,PersonSpan 被定义为 Person 和 Lifespan 的交集,因此 PersonSpan 类型的对象必须具有 Person 和 Lifespan 的所有属性。即使 keyof PersonSpan 结果是“name” | 「出生」 | “death”,这并不意味着任何仅具有这些属性之一的对象对 PersonSpan 有效,它意味着您初始化的这个类型 K 是 PersonSpan 属性名称的并集,您可以使用键“name”访问这些属性PersonSpan 类型的对象上的 、“出生”或“死亡”也可能是您正在寻找的 Partial 类型,它使所有 props 都是可选的