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
