Utöka 'generisk' TypeScript-gränssnitt


Med tanke på följande TS-definition:

type GenericPropsWithChildren<T> = T & { children?: ReactNode };

Inget fel med type men jag undrar om det finns en interface-motsvarighet? Självklart är det möjligt att skicka generiska ner i gränssnitt men det är inte vad jag är ute efter, t.ex.:

interface GenericPropsWithChildren<T> {
 children?: ReactNode;
 myProps: T; // not desired
}

Exemplen här är i ett sammanhang av React-kod men det underliggande problemet är grundläggande TS.

Svar #1

Medlemmarna i ett gränssnitt måste vara kända vid deklaration, och att använda en generisk typparameter i extends bryter mot denna regel. Så det finns inget sätt att skapa ett motsvarande generiskt gränssnitt.

Om du redan känner till typparametern kan du faktiskt ärva en typalias i ett gränssnitt. Så länge alla medlemmar är kända vid deklarationen är det tillåtet :

import { ReactNode } from 'react'

type GenericPropsWithChildren<T> = T & { children?: ReactNode };

interface Concrete extends GenericPropsWithChildren<{ p: string }> {

}

Lekplatslänk

Relaterade artiklar