typescript - Ignorera bundlade .d.ts och använd externa deklarationer


Jag försöker använda validate.js-biblioteket, som inkluderar sin egen TypeScript-deklarationsfil.

Tyvärr är det inte en särskilt bra typning av biblioteket, och det finns en mycket bättre i DefinitelyTyped. Jag installerade NPM-paketet @types/validate.js, men TypeScript använder det inte, och använder istället deklarationerna som är bundna direkt med biblioteket.

Finns det något sätt att få kompilatorn att använda de bättre deklarationer jag har tillgängliga?

Svar #1

Du kan inte använda deklarationer för validate.js från DefinitelyTyped ensam eftersom det inte finns någon enda top-level export i den - de deklarerar bara några gränssnitt inne i ValidateJS-namnrymden.

Och du kan inte använda bundlade deklarationer för validate.js, åtminstone inte för node (module=commonjs), eftersom de använder standardexport istället för export =.

Så du måste tillhandahålla dina egna deklarationer för att kunna importera validate.js korrekt:

skapa fil validate.d.ts:

declare var validate: (attributes: any, constraints: any, options?: any) => any;
export = validate;

Och tala om för TypeScript att använda den istället för den i node_modules genom att använda paths i tsconfig.json:

  "compilerOptions": {
    "baseUrl": ".", // This must be specified if "paths" is.
    "paths": {
      "validate.js":  ["./validate.d.ts"]
    }
  }

(Observera att du måste ha baseUrl om du har paths, så ställ in "baseUrl" : "." om du inte redan har det inställt på något annat)

Då kan du använda det så här (ValidateJS.Constraints och andra är tillgängliga direkt så snart du npm install @types/validate.js):

import validate = require('validate.js');


let constraints: ValidateJS.Constraints = {
    'foo': {presence: true}
};

let e = validate({}, constraints);

console.dir(e);

utdata :

{ foo: [ 'Foo can\'t be blank' ] }

Relaterade artiklar