假設我有一個型別,例如
interface Definition {
[key: string]: {
optional: boolean;
}
}
現在是否可以構造一個型別ValueType<T extends Definition>,用于定義
{
foo: { optional: true },
bar: { optional: false }
}
輸出型別
{
foo?: string;
bar: string;
}
那可能嗎?
我的第一種方法是由映射型別構成的構造,Omit它通過將可選和必需屬性合并到單個物件中來作業。但是,這需要一個由所有可選鍵組成的聯合型別,我不知道如何做到這一點。
基本理念是:
type ValueType<T extends Definition> =
{ [key in keyof T]?: string }
& Omit<{ [key in keyof T]: string }, OptionalKeys<T>>
回傳由OptionalKeys<T>所有可選鍵組成的上述聯合型別。
uj5u.com熱心網友回復:
您可以使用以下邏輯獲得該行為:
type ValueType<T extends Record<string, { optional: boolean }>> =
(
{ [K in keyof T]?: string } &
{ [K in keyof T as T[K]["optional"] extends false ? K : never]-?: string }
) extends infer O ? { [K in keyof O]: O[K] } : never
我們創建所有鍵 where optionalis truewith?和所有鍵 where optionalis的交集false。最后extends infer O ? {[K in keyof O]: O[K]} : never的使型別“更漂亮”但在功能上無關緊要。
編輯:
感謝@jcalz。我們可以讓它更短一點,同時保持鍵的順序。
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/481038.html
標籤:打字稿
上一篇:如何正確鍵入此物件轉換?
