簡體   English   中英

獲取 TypeScript 中的類型鍵

[英]Get Type keys in TypeScript

假設我們有這種類型:

export type UsersSchema = {
  id: number;
  firstName: string;
  lastName: string;
  email: string;
};

有沒有辦法讓這個偽代碼工作:

Object.keys(UsersSchema)理想情況下會產生: ['id', 'firstName', 'lastNight', 'email']

顯然UsersSchema不是一個值,所以上面的不起作用......

該類型在運行時不存在。

但是,(嚴重依賴這個漂亮的答案,因為它使用遞歸條件類型,它需要 TS4.x),您可以創建一個元組類型來強制使用所需名稱的元組。

所以:

type TupleUnion<U extends string, R extends string[] = []> = {
    [S in U]: Exclude<U, S> extends never 
                ? [...R, S] 
                : TupleUnion<Exclude<U, S>, [...R, S]>;
}[U] & string[];


export type UsersSchema = {
  id: number;
  firstName: string;
  lastName: string;
  email: string;
};

const allKeysOfUsersSchema: TupleUnion<keyof UsersSchema> = 
    ["id", "firstName", "lastName", "email"]; //OK

const wrongKeysOfUsersSchema: TupleUnion<keyof UsersSchema> = 
    ["monkey", "firstName", "lastName", "email"]; //error

const missingKeysOfUsersSchema: TupleUnion<keyof UsersSchema> = 
    ["id", "firstName", "lastName"]; //error

const tooManyKeysOfUsersSchema: TupleUnion<keyof UsersSchema> = 
    ["id", "firstName", "lastName", "email", "cat"]; //error

好的...因此您必須手動維護這個單獨的元組,但至少如果情況發生變化,編譯器會促使您采取補救措施,從而保持類型安全。

游樂場鏈接

您可以使用keyof類型運算符。

export type UsersSchema = {
  id: number;
  firstName: string;
  lastName: string;
  email: string;
};

type Keys = keyof UsersSchema // "id" | "firstName" | "lastName" | "email"

除了hwasurr answer 你可能需要將鍵放在括號中以獲得正確的類型

鍵數組:

type Keys = (keyof UsersSchema)[]
// ("id" | "firstName" | "lastName" | "email")[]

假設我們有這種類型:

export type UsersSchema = {
  id: number;
  firstName: string;
  lastName: string;
  email: string;
};

有沒有辦法讓這個偽代碼工作:

Object.keys(UsersSchema)理想情況下會產生: ['id', 'firstName', 'lastNight', 'email']

顯然UsersSchema不是一個值,所以上面不起作用......

暫無
暫無

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

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