簡體   English   中英

從 TypeScript 中的 keyof 類派生的聯合類型

[英]Union type derived from keyof class in TypeScript

在 TypeScript 中有沒有辦法使聯合類型成為僅在類中找到的鍵的聯合?

例如,讓MyClass如下:

class MyClass {
  propertyA: string;
  propertyB: number;
  propertyC: number[];

  someMethod() {
    // Do something
  }
}

有什么方法可以告訴 TypeScript 我只想要一個來自MyClass屬性的聯合類型? 所以,像

type MyType in keyof MyClass = "propertyA" | "propertyC";

這是無效的語法,但這是我正在尋找的效果。

另外如果我嘗試

type MyType in keyof MyClass = "propertyA" | "propertyC" | "heyThere";

這將是一個錯誤,但以下

type MyType in keyof MyClass = "propertyA" | "propertyB" | "propertyC";

不會。

我在 TypeScript 中缺乏正式的詞匯,所以我不確定這里有什么幫助。

我在這里和網上都看過,但我發現了與我想要的不同的東西。 例如,我遇到過

type MyType = keyof MyClass;

但這給了我MyClass一切。

獎勵:我們如何告訴 TypeScript 我們期望的類型必須是字符串的聯合?

我還注意到,如果我使用Pick內置類型,TypeScript 會正確地強制我為該類選擇鍵,而Omit內置類型則不會。 這就是為什么我要尋找這個警告。

沒有像您描述的那樣起作用的內置語法,但是您可以像這樣創建輔助類型別名

type MustExtend<U, T extends U> = T;

然后代替

// type MyType in keyof MyClass = "propertyA" | "propertyC";

你可以寫

type MyType = MustExtend<keyof MyClass, "propertyA" | "propertyB">; // okay
// type MyType = "propertyA" | "propertyB"

它可以按需要工作。 如果你犯了錯誤,它會警告你:

type MyType2 = 
  MustExtend<keyof MyClass, "propertyA" | "propertyC" | "heyThere">; // error!
// -----------------------> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Type '"heyThere"' is not assignable to type 'keyof MyClass'.

也隨心所欲。

Playground 鏈接到代碼

暫無
暫無

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

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