javascript - Ta bort null-attribut från ett objekt i Typescript


Som referens, ta bort tomma attribut från ett objekt i Javascript, hur gör man det kompatibelt med Typescript?

JS-funktion (nästa objekt | ES10):

function removeEmpty(obj) {
  return Object.fromEntries(
    Object.entries(obj)
      .filter(([_, v]) => v != null)
      .map(([k, v]) => [k, v === Object(v) ? removeEmpty(v) : v])
  );
}

Jag har försökt med Exclude<T, null> men det fungerar inte med inbäddade objekt och jag tror inte att det är rätt verktyg att använda.

Observera att den returnerade typen bör ta bort null-typ(er) men behåller undefined.

Exempel/Förväntat beteende:

type TestType = {
  a?: {
    b?: {
      c: string;
    } | null;
    z?: {
      x: string;
    };
  } | null;
};

const testObj: TestType = {
  a: {
    b: null,
    z: { x: 'Hi' }
  }
};

const resultObj = removeEmpty(testObj);

Där resultObj-typen liknar:

type ResultTestTypeExample = {
  a?: {
    b?: {
      c: string;
    };
    z?: {
      x: string;
    };
  };
};

Svar #1

Fungerar det här för dig?

type ExpandRecursively<T> = T extends object
  ? T extends infer O ? { [K in keyof O]: ExpandRecursively<O[K]> } : never
  : T;

type RemoveNull<T> = ExpandRecursively<{ [K in keyof T]: Exclude<RemoveNull<T[K]>, null> }>

Användning :

function removeEmpty<T extends object>(obj: T): RemoveNull<T> {
  return Object.fromEntries(
    Object.entries(obj)
      .filter(([_, v]) => v != null)
      .map(([k, v]) => [k, v === Object(v) ? removeEmpty(v) : v])
  ) as RemoveNull<T>
}

Lekplats

Svar #2

export function removeNull<T extends object>(obj: T | any) {
  Object.keys(obj).forEach(k => {
    const key = k as keyof T
    if (obj[key] && typeof obj[key] === 'object') removeNull(obj[key])
    else if (obj[key] == null) delete obj[key]
  })
  return obj
}

Du kan ta bort null-element med koden ovan. Du kan också ange din typ och det kommer att ta bort alla egenskaper hos inbäddade objekt

Relaterade artiklar