javascript - TypeScript-kompilator ignorerer deklarationsfil i tsconfig.json


Jeg prøver i øjeblikket at sætte et udviklingsmiljø op for en TypeScript REST-forbruger og støder på følgende problem: compiler ser ud til at have problemer med referencer til Typings, når de er placeret i .ts kildefiler, men ignorerer dem fuldstændigt, når jeg prøver at administrere mine referencer via en enkelt .d.ts-fil i tsconfig.json.

Jeg får en error TS2307: Cannot find module 'request'., mens jeg prøver at kompilere følgende kode:

import * as request from 'request';

module HTTPClient {
 ...   
}

Dette er min tsconfig.json-fil:

{
  "compilerOptions": {
    "jsx": "react",
    "module": "commonjs",
    "noImplicitAny": true,
    "noEmitOnError": true,
    "outDir": "./build/",
    "preserveConstEnums": true,
    "removeComments": true,
    "target": "ES5",
    "declarationFiles": true,
    "moduleResolution": "classic"
  },

  "exclude": [
    "./node_modules",
    "./build",
    "./tests"
  ],

  "include": [
    "./src/ts/**/*",
    "./typings/main.d.ts"
  ]
}

Og dette er gulp-koden, jeg bruger til at kompilere og samle alt:

var typescriptProject = typescriptCompiler.createProject(project['tsconfig'], { typescript: typescript });

gulp.task(
    'compile-ts',
    function () {
        return gulp
            .src([ project['ts'] + '**/*{ts, tsx}' ])
            .pipe(typescriptCompiler(typescriptProject))
            .js
            .pipe(gulp.dest(output['js']));
    }
);

gulp.task(
    'bundle-js',
    function () {
        return browserify(output['js'] + 'main.js')
            .bundle()
            .pipe(source('bundle.js'))
            .pipe(gulp.dest(output['web']));
    }
);

Jeg har de ambient definitioner for Request installeret og refereret i typings/main.d.ts. Kan dette have noget at gøre med den måde, jeg bruger browserify på til at løse modulerne? Enhver hjælp vil blive meget værdsat.

Svar #1

Problemet blev forårsaget af to ting:

Først, hvis du bruger gulp-typescript til først at kompilere din kode og derefter kun bundle den med browserify (uden at bruge tsify), har du flere muligheder for, hvordan du konfigurerer compileren. Hvis du vælger at konfigurere den med tsconfig.json, skal du først oprette et TypeScript-projektobjekt med gulp-typescript på følgende måde:

var typescriptCompiler = require('gulp-typescript');
var typescriptProject = typescriptCompiler.createProject(project['tsconfig'], { typescript: typescript });

Og derefter skal du give kilderne hentet fra projektet til compileren i din gulp-opgave:

gulp.task(
    'compile-ts',
    function () {
            return typescriptProject
                .src()
                .pipe(typescriptCompiler(typescriptProject))
                .js
                .pipe(gulp.dest(output['js']));
    }
);

Det andet problem var, at jeg inkluderede "typings/main.d.ts" i kilderne. Dette forårsagede en hel masse "TS2300: Dubleret identifikator"-fejl: at løse det var bare et spørgsmål om at flytte "typings/main.d.ts" til "exclude"-sektionen for at undgå duplikation.

BEMÆRK: Typings-versionen var faktisk forældet; hvis du støder på dette problem, skal du opdatere den.

Relaterede artikler