簡體   English   中英

如何強制 object 在 Typescript 中擁有一個以聯合類型命名的屬性?

[英]How to force object to have a property named over a union type in Typescript?

我定義了以下類型

type MyUnionType = "propA" | "propB"
type MyType = {
  myProp: MyUnionType
}

type SomeOtherType = MyType & { ... /* other props*/ ... }

現在,我想用類似的東西來增強MyType

type MyType = {
  myProp: MyUnionType,
  [key in MyUnionType]: any // pseudo code
}

這樣我就可以像這樣使用它

const obj: SomeOtherType = {
  myProp: "propA",
  propA: "some value" // if this is missing, compiler will error
  [...] // some other props
}

我玩了一下,搜索了web,但我沒有想出任何解決方案。

編輯:我剛剛按要求從MyUnionType中刪除了string

為此,您希望MyType是一個聯合類型,相當於:

type MyType = {myProp: "propA", propA: any} | {myProp: "probB", propB: any}

這具有以下理想行為:

const goodObjA: MyType = {
  myProp: "propA",
  propA: "some value" 
} // okay

const badObjA: MyType = { // error! Property propA is missing
  myProp: "propA",
}

const goodObjB: MyType = {
  myProp: "propB",
  propB: "some value" 
} // okay

const badObjB: MyType = {
  myProp: "propB",
  propA: "oops" // error, unexpected property
}

所以現在唯一的問題是如何從MyUnionType以編程方式生成MyType 從概念上講,我們希望獲取MyUnionType聯合中的每個成員K ,並生成一個新聯合{ myProp: K } & { [P in K]: any } (它具有類型為KmyProp屬性和K鍵屬性類型為any 。也就是說,我們要在MyUnionType聯合中分發type F<K> = { myProp: K} & { [P in K]: any }操作。

這可以通過幾種方式完成,但我的方法是制作所謂的分布式 object 類型,如microsoft/TypeScript#47109中所創造的。 這個想法是您在MyUnionType中的每個K上創建一個映射類型,然后立即使用MyUnionType 對其進行索引,從而產生所需的聯合:

type MyType = { [K in MyUnionType]:
  { myProp: K } & { [P in K]: any }
}[MyUnionType]

這評估為

type MyType = 
  ({ myProp: "propA"; } & { propA: any; }) | 
  ({ myProp: "propB"; } & { propB: any; });

相當於我們想要的類型。

Playground 代碼鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM