typescript 如何基于某些条件递归地替换嵌套对象的所有类型?

wj8zmpe1  于 2022-12-24  发布在  TypeScript
关注(0)|答案(1)|浏览(179)

在TypeScript网站上的Further Exploration示例中,他们向我们展示了一种基于某些条件将属性类型替换为不同类型的方法。
我们怎样才能做同样的事情,但以递归的方式?即不仅Map第一级属性,但任何嵌套的属性,通过检查。
示例:

type ExtractPII<Type> = {
  [Property in keyof Type]: Type[Property] extends { pii: true } ? true : false;
};

type DBFields = {
  id: { format: "incrementing" };
  name: { type: string; pii: true };
};

type ObjectsNeedingGDPRDeletion = ExtractPII<DBFields>;
// type ObjectsNeedingGDPRDeletion = { id: false; name: true; }

我需要什么:

type DBFields = {
  id: { format: "incrementing", foo: { type: string; pii: true } };
  name: { type: string; pii: true };
};

type ObjectsNeedingGDPRDeletion = ExtractPII<DBFields>; 
// type ObjectsNeedingGDPRDeletion = { id: { format: string; foo: true }; name: true; }
nfeuvbwi

nfeuvbwi1#

false的情况下,您只需要执行另一个检查,看看该类型是否是一个对象,然后对该属性调用ExtractPii

type ExtractPII<T> = {
  [P in keyof T]: T[P] extends { pii: true } 
    ? true 
    : T[P] extends object 
      ? ExtractPII<T[P]> 
      : T[P];
};

这将导致:

type DBFields = {
  id: { format: "incrementing", foo: { type: string; pii: true } };
  name: { type: string; pii: true };
};

type ObjectsNeedingGDPRDeletion = ExtractPII<DBFields>;

const a: ObjectsNeedingGDPRDeletion = {
    name: true,
    id: {
        foo: true,
        format: "incrementing"
    }
}

如果你想在false的情况下的值false,然后只需替换T[P]false

type ExtractPII<T> = {
  [P in keyof T]: T[P] extends { pii: true } 
    ? true 
    : T[P] extends object 
      ? ExtractPII<T[P]> 
      : false;
};

相关问题