搜尋

首頁  >  問答  >  主體

如何透過 keyof 理解 TypeScript 交集

<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>
P粉451614834P粉451614834437 天前436

全部回覆(1)我來回復

  • P粉267791326

    P粉2677913262023-09-06 20:12:26

    在 TypeScript 中,當您使用兩個或多個類型的交集 & 定義類型時,產生的類型將具有每個交集類型的所有屬性。在本例中,PersonSpan 被定義為 Person 和 Lifespan 的交集,因此 PersonSpan 類型的物件必須具有 Person 和 Lifespan 的所有屬性。即使keyof PersonSpan 結果是“name” | “出生” | “death”,這並不意味著任何僅具有這些屬性之一的物件對PersonSpan 有效,它意味著您初始化的這個類型K 是PersonSpan 屬性名稱的並集,您可以使用鍵「name」存取這些屬性PersonSpan 類型的物件上的、「出生」或「死亡」也可能是您正在尋找的Partial 類型,它使所有props 都是可選的

    let obj: Partial<PersonSpan> = {  
       name: "John Smith"
    }

    回覆
    0
  • 取消回覆