[英]Pick keys from a Typescript interface and change their types
我有這個界面:
export interface MutationSheetDefinition {
_type: "mutation.sheet.definition"
id: string
name: string
mutations: MutationDefinition[]
referencedMutationSheets: MutationSheetReference[]
}
我想要這種類型:
interface ValidatedMutationSheetDefinition {
name: ValidationOf<string>
mutations: ValidationOf<MutationDefinition>[]
referencedMutationSheets: ValidationOf<MutationSheetReference>[]
}
我知道我可以使用以下方法選擇我們的界面子集:
type narrowed = Pick<MutationSheetDefinition, "name"| "mutations" | "referencedMutationSheets">
這會給我
interface {
name: string
mutations: MutationDefinition[]
referencedMutationSheets: MutationSheetReference[]
}
但是我可以更改拾取鍵的類型嗎?
我會為所有選擇的鍵選擇一個固定類型,所以這樣做:
interface {
name: Validation
mutations: Validation[]
referencedMutationSheets: Validation[]
}
你可以這樣做:
type PickAndChangeToValidationOf<T, P extends keyof T> = {
[K in P]: T[K] extends (infer I)[]
? ValidationOf<I>[]
: ValidationOf<T[K]>
}
我不確定您希望如何處理數組。 在您的示例中,您刪除了[]
並將其放在ValidationOf<T>
后面。 上面的類型也這樣做,但僅適用於第一級數組。 如果您希望雙嵌套數組具有不同的行為,則應指定。
用法:
interface MutationSheetDefinition {
_type: "mutation.sheet.definition"
id: string
name: string
mutations: number[]
referencedMutationSheets: number[]
}
type Narrowed = PickAndChangeToValidationOf<MutationSheetDefinition, "name"| "mutations" | "referencedMutationSheets">
// type Narrowed = {
// name: ValidationOf<string>;
// mutations: ValidationOf<number>[];
// referencedMutationSheets: ValidationOf<number>[];
// }
你在那里(我用隨機字符串交換了你的自定義類型,只需刪除它們):
type MutationDefinition = "MutationDefinition";
type MutationSheetReference = "MutationSheetReference";
export interface MutationSheetDefinition {
_type: "mutation.sheet.definition"
id: string
name: string
mutations: MutationDefinition[]
referencedMutationSheets: MutationSheetReference[]
}
type Narrowed = Pick<MutationSheetDefinition, "name"| "mutations" | "referencedMutationSheets">;
type Validation = "Validation";
type Validational<Type> = {
[Property in keyof Type]: Type[Property] extends unknown[] ? Validation[] : Validation;
};
type Definition = Validational<Narrowed>;
const d: Definition = {
name: "Validation",
mutations: ["Validation", "Validation"],
referencedMutationSheets: ["Validation", "Validation"],
}
此解決方案的一個缺點是它的類型硬編碼為僅數組和所有其他內容。 如果您使用任何其他類型,則必須添加更多類型,即需要添加數組數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.