typescript - Utvid grensesnitt definert i .d.ts-fil


I mitt TypeScript-prosjekt bruker jeg DefinitelyTyped-definisjoner for eksterne js-avhengigheter.

Noen ganger kan det hende at disse definisjonene er utdaterte. Det kan også hende at noen biblioteker kan legge til nye metoder ved kjøring, som express-validator der du kan definere egendefinerte valideringsfunksjoner.

Derfor vil jeg gjerne utvide disse .d.ts-definisjonene ved å legge til nye metoder og/eller egenskaper.

Så hvis jeg har min DefinitelyTyped-definisjon i express-validator.d.ts:

declare module ExpressValidator {
  export interface Validator {
    is(): Validator;
    not(): Validator;
    isEmail(): Validator;
    ...
  }
}

Hvordan kan jeg utvide Validator-grensesnittet innenfor, for eksempel, min application.ts?

///<reference path='../typings/tsd.d.ts' />

import expressValidator = require('express-validator');
export var app = express();

app.use(expressValidator({
    customValidators: {
        isArray: function(value) {
            return Array.isArray(value);
        }
 }
}));

// How to extend Validator interface adding isArray() method??

Svar #1

// Hvordan utvide Validator-grensesnittet ved å legge til isArray()-metoden??

Du kan ikke gjøre dette i en fil som er et modul (noe veiledning her), og filen din er et modul fordi du har import expressValidator.

Lag i stedet en extendedValidator.d.ts og legg til det nye for TypeScripts motor:

declare module ExpressValidator {
  export interface Validator {
     isArray: any;
  }
}

Svar #2

Jeg klarte å oppnå dette ved å følge instruksjonene på https://www.credera.com/blog/technology-solutions/typescript-adding-custom-type-definitions-for-existing-libraries/. Der bruker de eksemplet react.

import 'react';
 
declare module 'react' {
    interface OlHTMLAttributes<T> {
        type?: "1" | "a" | "A" | "i" | "I";
    }
}

Jeg fant ut at dette fungerer veldig godt for winston også.

Relaterte artikler