node.js - Byg en Node-pakke ved hjælp af Typescript 1.5 og generer deklarationsfilen


Jeg er ny til Javascript, Node og Typescript og prøver hårdt at bruge dem.

Kort fortalt

  • Hvordan bygger vi korrekt en node-pakke ved hjælp af Typescript?
  • Hvordan bygger vi korrekt en deklarationsfil, der matcher node-pakke API'en i én fin fil?

Her er min historie:

Jeg vil gerne bruge Typescript til at kode et javascript-bibliotek til et Node.js-format. Og til sidst vil jeg gerne generere den passende deklarationsfil for at gøre det tilgængeligt for fremtidig Typescript-udvikling. Jeg bruger gulp-typescript til at kompilere dem alle.

Efter timer med forskning og fejl...

Her er, hvad jeg gjorde:

foo.ts

export class Foo {
    private id: number;
    constructor() {
        this.id = 0;
    }
}

impl.ts

import foo = require('foo');

export function make(): boolean {
    var f = new foo.Foo();
    return true;
}

main.ts

declare module 'test' {
    export import impl = require('impl');
}

module.exports = {
    impl: require('impl')
};

gulpfile.js

var gulp = require('gulp')
  , ts = require('gulp-typescript');    

var TS_FILES = 'src/**/*.ts';    

gulp.task('default', ['build_node']);    

// Compile the node package from Typescript source code
gulp.task('build_node', function() {
  var project = ts.createProject({
    declarationFiles: true,
    emitDecoratorMetadata: true,
    module: 'commonjs',
    noEmitError: true,
    noImplicitAny: true,
    removeComments: true,
    target: 'ES5'
  });    

  var tsResult = gulp.src(TS_FILES)
  .pipe(ts(project));    

  tsResult.js
  .pipe(gulp.dest('build'));    

  tsResult.dts
  .pipe(gulp.dest('definition'));
});

Her er, hvad jeg har:

  • 3 erklæringsfiler:

foo.d.ts

export declare class Foo {
    private id;
    constructor();
}

impl.d.ts

export declare function make(): boolean;

main.d.ts

declare module 'test' {
    export import impl = require('impl');
}
  • 3 javascript-filer:

foo.js og impl.js ser bare normale ud. Og...

main.js

module.exports = {
    impl: require('impl')
};

Jeg ved ikke engang, om det virker eller ej, men det ser i hvert fald forkert ud for mig... Jeg mener, jeg synes virkelig, jeg har gjort noget forkert, og det er ikke den rigtige måde at bygge et node-pakke på og have dens erklæringsfil.

Årsagerne?

Når jeg ser på DefinitelyTyped-deklarationsfilen, er de fleste af dem i én fil med hver export-deklaration pænt inkluderet som følger:

declare module 'test' {
    export function make(): boolean;
    ...
}

Og have en node-pakke, der eksponerer sit API som følger:

module.exports = {
    version: '1.0',
    impl: require('impl');
}

Jeg har læst hundredevis af opslag, men intet synes at generere, hvad jeg ønsker.

Kan du venligst forklare mig:

  • Hvordan bygger vi korrekt en node-pakke ved hjælp af Typescript?
  • Hvordan bygger vi korrekt en deklarationsfil, der matcher node-pakke API'en i én fin fil?

Rediger: Jeg bruger ikke export =, fordi jeg vil kunne erklære og eksportere flere ting i én fil. Eks.: At have en klasse og en konstruktørhjælpefunktion i samme fil.

Svar #1

Der er mange måder at gøre dette på, da der endnu ikke er nogen officiel støtte. Du kan følge den officielle støtte her: https://github.com/Microsoft/TypeScript/issues/2338

Jeg bruger dog https://github.com/TypeStrong/atom-typescript#packagejson-support

Eksempelprojekt på NPM: https://github.com/basarat/ts-npm-module
Eksempelprojekt der bruger projektet fra NPM: https://github.com/basarat/ts-npm-module-consume

Svar #2

Sådan opnår jeg at bygge noget, der virker

projekt

  • Byg js-biblioteket separat som det er.

    • Fjern alle ///<reference ... tags fra output
  • Byg typedefinitionsfil fra skabelon

    • Byg definitionsfiler som de er
    • Saml dem alle i én fil
    • Fjern alle ///<reference ...-tags og import fra output
    • Indsæt outputpost i skabelon index.tmpl.d.ts fil
    • Erstat declare export ... med export ...

Relaterede artikler