ramda.js - Ramda och Typescript: lägg till saknade typdefinitioner


Jag använder TypeScript och Ramdajs i mitt nuvarande projekt. Och jag har precis insett att vissa typer saknas, t.ex. finns det ingen typ för innerJoin-funktionen ( @types/ramda version är 0.25.36, den senaste om jag gissar just nu). Jag har försökt lägga till egna definitioner i en separat fil inom projektet:

declare namespace R {
    interface Static {
        innerJoin(): any;
    }
}

och till och med:

declare let R: R.Static;

declare namespace R {
    interface Static {
        innerJoin(): any; /* here should be a specific signature */
    }
}

export = R;
export as namespace R;

men utan framgång - typescript markerar R.innerJoin(/*...*/) som okänd:

Egenskapen 'innerJoin' finns inte på typen 'Static'

Vet någon hur man implementerar det korrekt? Jag hittade en lösning: const R_innerJoin=(R as any).innerJoin Men jag misstänker att det borde finnas en mer elegant lösning med hjälp av '.d.ts' ...

P.S. ramda-versionen är 0.25.0 om det spelar någon roll.

Uppdatering

Jag använder Ramda på detta sätt:

import * as R from 'ramda';
const myFn = (a, b) => R.innerJoin(// etc

Svar #1

Eftersom du importerar R-namnrymden från modulen måste du utöka den ursprungliga modulen. Om du deklarerar din egen R-namnrymd kommer du i bästa fall att se antingen din egen namnrymd eller den importerade, inte en sammanslagning. Följande fungerar för mig efter lite försök och misstag:

declare module "dummy" {
    module "ramda" {
        interface Static {
            innerJoin(): any;
        }
    }
}

Den yttre moduldeklarationen behövs för att göra den inre moduldeklarationen till en "förstärkning" istället för att skugga den ursprungliga modulen, som nämns i den här tråden. Den där tricken är tyvärr inte ordentligt dokumenterad såvitt jag vet.

Relaterade artiklar