Hur man utelämnar en egenskap från en partial<type> i Typescript?


Jag vill tillåta en delvis utan att tillåta ett id för en TypeScript-metoduppdatering som ser ut så här:

update(id: number, newObject:Omit<Partial<Object>,id>): CustomObject {
  const index =  this.objects.findIndex(
    (object: CustomObject) => object.id == id
  );

this.objects[index] = {
  ...this.objects[index],
  ...newObject
};

return this.object[index];

}

Detta tillvägagångssätt verkar dock misslyckas eftersom jag fortfarande kan skicka ett objekt med id:t.

Svar #1

Genom att separera id-fältet från en basklass kan du helt enkelt använda basklassen som kontrakt och därmed utelämna id-fältet. Självklart kan du utöka den klassen med id-fältet där det är nödvändigt.

Svar #2

Jag använder en generisk typ så här:

export type PickPartial<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> & Partial<Pick<T, K>>

Används så här:

type MyType = PickPartial<{ hat: string, cat: string, dog: string }, "cat" | "dog">

const obj: MyType = { hat: "top hat" };
// compiles successfully

const obj2: MyType = { hat: "beanie", cat: "fluffy" };
// compiles successfully

const obj3: MyType = { hat: "cowboy hat", cat: "fluffy", dog: "buddy" };
// compiles successfully

const obj4: MyType = { cat: "fluffy", dog: "buddy" };
// error: 'hat' is missing