簡體   English   中英

定義 Partial 的逆<t>在 TypeScript</t>

[英]Defining the inverse of Partial<T> in TypeScript

TypeScript 有一個默認定義的Partial類型,所以你可以說Partial<{x: number, y: string}>來得到像{x?: number, y?: string}這樣的類型(類型的屬性變成可選的)。 它被定義為

type Partial<T> = {
    [P in keyof T]?: T[P]
}

我正在嘗試定義逆函數,我們稱它為Full<T> ,它確保 object 中的所有屬性都是必需的。 我從明顯的定義開始:

type Full<T> = {
    [P in keyof T]: T[P]
}

這只是Partial刪除了問號。 不幸的是,這不起作用——可選屬性仍然是可選的。 在某些情況下,typescript 似乎以某種方式保留了有關keyof類型中屬性名稱的必要性的信息。

有趣的是,如果您將該類型存儲在中間類型名稱中,則該信息將被刪除。 即這有效:

type Config = {foo: number, bar?: string}
type ConfigKey = keyof Config
type FullConfig = {[K in ConfigKey]: Config[K]}

FullConfig中(至少在 TypeScript 3.3 中), bar是必需的。 但是如果你將keyof Config內聯到FullConfig的定義中,它又是可選的。

我希望這是一個單一的、易於使用的類型,並且由於我不知道類型聲明定義本地類型的方法,所以這個 hack 似乎沒有多大幫助。

我缺少什么技巧嗎?

映射類型並非生而平等。 同態映射類型保留映射類型的修飾符。 從引入此功能的拉取請求中

通過這個 PR,我們在同態(結構保留)映射類型中保留屬性修飾符。 形式的映射類型{ [P in keyof T]: X }是同態與T (因為它有一組相同的屬性的T )並且當它們在性質存在現在保留可選和只讀改性劑T

從 2.8 開始,您可以使用- (請參閱PR )從此類類型中刪除修飾符:

type Full<T> = {
  [P in keyof T]-?: T[P];
}

筆記

您可以使用標准庫中預定義的Required類型,它的作用與Full完全相同。

type UndoParital<T> = T extends Partial<infer R>? R: T;

從 TypeScript 2.8 開始,我們現在有了Required<Type>實用程序類型。

從文檔:

構造一個類型,該類型由設置為必需的 Type 的所有屬性組成。 與部分相反。

https://www.typescriptlang.org/docs/handbook/utility-types.html#requiredtype

暫無
暫無

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

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