Ich versuche Typoskript zu lernen. Obwohl ich es nicht für relevant halte, verwende ich VSCode für diese Demo.
Ich habe eine package.json
, die diese Stücke enthält:
{
"devDependencies": {
"gulp": "^3.9.1",
"jspm": "^0.16.33",
"typescript": "^1.8.10"
},
"jspm": {
"moment": "npm:moment@^2.12.0"
}
}
Dann habe ich eine Typescript-Klasse main.js
wie diese:
import moment from 'moment';
export class Main {
}
Mein gulpfile.js
sieht so aus:
var gulp = require('gulp');
var typescript = require('gulp-tsb');
var compilerOptions = {
"rootDir": "src/",
"sourceMap": true,
"target": "es5",
"module": "amd",
"declaration": false,
"noImplicitAny": false,
"noResolve": true,
"removeComments": true,
"noLib": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true
};
var typescriptCompiler = typescript.create(compilerOptions);
gulp.task('build', function() {
return gulp.src('/src')
.pipe(typescriptCompiler())
.pipe(gulp.dest('/dest'));
});
Wenn ich gulp build starte, erhalte ich die folgende Meldung: "../main.ts(1,25): Cannot file module 'moment'."
Wenn ich verwende, import moment = require('moment');
funktioniert jspm und bringt das Modul ein, wenn ich die Anwendung ausführe, aber ich erhalte immer noch den Build-Fehler. Ich habe auch versucht:
npm install typings -g
typings install moment --ambient --save
Anstatt das Problem zu verbessern, wurde es schlimmer. Jetzt erhalte ich den obigen Fehler beim Erstellen sowie den folgenden:"../typings/browser/ambient/moment/index.d.ts(9,21): Cannot find namespace 'moment'."
Wenn ich zu der durch Eingaben bereitgestellten Datei gehe und am Ende der Datei hinzufüge:
declare module "moment" { export = moment; }
Ich kann den zweiten Fehler beheben lassen, aber ich benötige immer noch die require-Anweisung, damit der Moment in meiner main.ts
Datei funktioniert, und erhalte immer noch den ersten Build-Fehler.
Muss ich .d.ts
für einen Moment meine eigene Datei erstellen oder fehlt mir nur ein Setup-Teil?
quelle
import moment, { Moment } from 'moment';
const x = moment();
const x: Moment = moment();
Antworten:
Aktualisieren
Anscheinend bietet moment jetzt seine eigenen Typdefinitionen (laut sivabudh mindestens ab 2.14.1), sodass Sie diese nicht
typings
oder überhaupt nicht benötigen@types
.import * as moment from 'moment'
sollte die mit dem npm-Paket gelieferten Typdefinitionen laden.Das heißt jedoch, wie in moment / pull / 3319 # issuecomment-263752265 gesagt, scheint das Moment-Team einige Probleme bei der Pflege dieser Definitionen zu haben (sie suchen immer noch jemanden, der sie pflegt) .
Sie müssen
moment
Typisierungen ohne--ambient
Flag installieren .Dann schließen Sie es mit ein
import * as moment from 'moment'
quelle
--ambient
Flagge und nicht erklären ? Ich habe Ziffern mit der Umgebungsflagge arbeiten lassen. Die Hauptseite npmjs.com/package/typings enthält das Beispiel unter Verwendung des Umgebungsflags. Ich weiß nicht, wann ich eines über dem anderen verwenden möchte / muss. Vielen Dank!--ambient
Flag für alle Typoskript-Definitionen vontypings
/,DefinitelyTyped
aber diemoment
Definition hat eine seltsame Struktur und die Dateien werden nicht korrekt heruntergeladen. Wenn Sie sich die Definitionsdatei moment.d.ts ansehen , enthält sie nur einen Verweis auf die Knotenversion, die beim Download nicht behoben wird (möglicherweise lohnt es sich, ein Problem zu öffnen).Sie müssen moment () die Funktion und Moment die Klasse separat in TS importieren .
Ich habe hier einen Hinweis in den Typoskript-Dokumenten gefunden .
Der Code zum Importieren von moment js in Typoskript sieht also tatsächlich so aus:
quelle
import * as moment from 'moment';
und dannmoment.Moment
für die Eingabe verwendet werden.moment.Moment
Schnittstelle auch direkt aus dem Namespace verwendenmoment
Ich bin mir nicht sicher, wann sich dies geändert hat, aber mit der neuesten Version von Typoskript müssen Sie nur verwenden
import moment from 'moment';
und alles andere sollte wie gewohnt funktionieren.AKTUALISIEREN:
Sieht so aus, als ob der Import kürzlich behoben wurde. Ab mindestens
2.24.0
möchten Sie verwendenimport * as moment from 'moment';
quelle
import * as moment from 'moment'
funktioniert nicht mit Typoskript,import moment from 'moment'
tut es aber .esModuleInterop
Satzestrue
in meiner Konfiguration, den ich aus dieser Antwort erhielt . Vielen Dank.über Typisierungen
Moment.js unterstützt jetzt TypeScript in Version 2.14.1.
Siehe: https://github.com/moment/moment/pull/3280
Direkt
Könnte nicht die beste Antwort sein, aber dies ist der Brute-Force-Weg, und er funktioniert für mich.
moment.js
Datei herunter und fügen Sie sie in Ihr Projekt ein.$ tree . ├── main.js ├── main.js.map ├── main.ts └── moment.js
`` `
node
zum Laufen verwendenmain.js
.quelle
1. Moment installieren
2. Testen Sie diesen Code in Ihrer Typoskriptdatei
quelle
Ich habe gerade bemerkt, dass die Antwort, die ich positiv bewertet und kommentiert habe, nicht eindeutig ist. Das Folgende ist genau das, was für mich funktioniert hat. Ich bin derzeit auf Moment
2.26.0
und TS3.8.3
:In Code:
In der TS-Konfiguration:
Ich baue sowohl für CommonJS als auch für EMS, sodass diese Konfiguration in andere Konfigurationsdateien importiert wird.
Die Erkenntnis ergibt sich aus dieser Antwort, die sich auf die Verwendung von Express bezieht. Ich dachte, es lohnt sich, hier etwas hinzuzufügen, um jedem zu helfen, der in Bezug auf Moment.js sucht, anstatt etwas allgemeineres.
quelle
Immer noch kaputt? Versuchen Sie es zu deinstallieren
@types/moment
.Also habe ich das
@types/moment
Paket aus derpackage.json
Datei entfernt und es hat funktioniert mit:Neuere Versionen von
moment
erfordern das@types/moment
Paket nicht, da Typen bereits enthalten sind.quelle