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
- Fjern alle
Byg typedefinitionsfil fra skabelon
- Byg definitionsfiler som de er
///<reference ...-tags og import fra outputindex.tmpl.d.ts fildeclare export ... med export ...