express - Vad betyder <this> i TypeScript-generics?


Vi använder express med TypeScript i vår app. Jag stötte på deras typdefinitioner och undrade vad följande betyder:

export interface IRouter extends RequestHandler {
    all: IRouterMatcher<this>;
}

I synnerhet IRouterMatcher<this>.

Jag läste dokumentationen några gånger och kunde inte hitta något som nämnde detta användningsfall. Och det är ganska svårt att söka efter <this> varken på SO eller på webben eftersom vinkelparenteserna vanligtvis tas bort.

Svar #1

this hänvisar till den aktuella tillgängliga typen.

Detta kan också vara subtypen av den åsidosatta klassen eller gränssnittet.

Se även Polymorfa this-typer på https://www.typescriptlang.org/docs/handbook/advanced-types.html

Exempel :

class Calculator {
    a: number;
    add(): this {
        a++;
        return this;
    } 
}

class AdvancedCalculator {
    substract(): this {
         a--;
         return this;
    } 
}

new AdvancedCalculator()
   .add() // returns AdvancedCalculator as "this" 
   .substact() // it compiles! 

Svar #2

Jag tror att <this>, i ditt exempel, refererar till typen som för närvarande implementerar gränssnittet. Till exempel, om en klass som heter TestClass implementerade IRouter, skulle funktionerna som returnerar IRouterMatcher<this> returnera en IRouterMatcher<TestClass>.

Efter att ha gjort lite mer forskning, kan användning av <this> vara funktionellt ekvivalent med att säga <T extends IRouter> såsom all: IRouterMatch<T extends IRouter>. Att använda this kan bara vara ett kortare sätt att uttrycka samma sak.

Relaterade artiklar