angularjs - TypeScript-kompilatoren utelater importert angular-translate-modul


Jeg holder på å konvertere et Angular 1.5-prosjekt til TypeScript og støtte på et problem med import av angularTranslate.

Jeg prøver å importere både angular og angular-translate slik:

import * as angular from "angular";
import * as angularTranslate from "angular-translate";

console.log(angular, angularTranslate);

Jeg bruker typings installert fra DefinitelyTyped/angular-translate.d.ts.

Når jeg kompilerer med TypeScript 1.8 (module: "commonjs") genererer det denne JavaScript-en:

"use strict";
var angular = require("angular");
console.log(angular, angularTranslate);

Som du kan se har den fjernet angularTranslate-importen selv om den er referert til, og den tilsvarende brukte angular-importen beholdes. Dette resulterer i en kjøretidsfeil ReferenceError: angularTranslate is not defined. Dette fungerer fint med Babel. Hvordan bør jeg importere angularTranslate?

Rediger:

Dette avgir heller ingenting:

import angularTranslate = require("angular-translate");

Men dette gir den forventede utgangen:

let angularTranslate = require("angular-translate");

Er det noe galt med angular-translate-modulen som gjør det umulig å bruke den med import i TypeScript?

Svar #1

Problemet er at «angular-translate»-modulen eksporterer et navnerom. Som en midlertidig løsning kan du referere til gammel versjon av angular-translate.d.ts eller lage en egen kopi og fikse den manuelt.

Svar #2

angular 1.5 støtter ikke modulstrukturen til JS eller UMD (det har sitt eget modulsystem). Så hvis du importerer noe fra "angular", importerer du bare typer fra en definitly typed-fil fra ambient moduldeklarasjon, og TypeScript-transpileren klarer å gjenkjenne at det ikke er nødvendig å generere CommonJS importdefinisjon til det resulterende JS (bare deklarasjon importeres). Men i tilfelle du direkte definerer import med CommonJS required-syntaks (eller med ES6 import "module"), oppretter du en side-effekt-import som kjører angular-scriptet når modul-lasteren eller bundleren laster den nødvendige modulen.

Relaterte artikler