typescript - Inkapsla snittyp i ett gränssnitt


Jag ser mig själv skriva följande överallt:

product: Product & { id: string; };

Hur skriver jag ett gränssnitt, så att jag istället kan skriva

product: WithId<Product>;

Jag försökte något liknande, men kompilatorn gillar inte att ärva från generiska typer:

export interface WithId<T> extends T {
    id: string;
}

Svar #1

Du kan abstrahera konstruktionen genom abstraktion av & {id: string}

export type WithId<T> = T & { id: string }

type Example = WithId<{ a: number }> // {a: number, id: string}
const example: Example = {a: 1, id: 'id'}

PS. { [K in keyof T]: T[keyof T] } är inget annat än T själv, så överflödigt.

Svar #2

Du kan använda en typintersection

export type WithId<T> = { [K in keyof T]: T[keyof T] } & { id: string }


interface product { myNew: string }
let et: WithId<product> = { myNew: "s", id: "s" } // ok
let et: WithId<product> = { test: "s", id: "s" } // error