如何透過 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 都是可選的