簡體   English   中英

從 Typescript 界面中選擇鍵並更改它們的類型

[英]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.

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