Próbuję się nauczyć maszynopisu. Chociaż uważam, że to nie jest istotne, używam VSCode do tego demo.
Mam to, package.json
które zawiera te elementy:
{
"devDependencies": {
"gulp": "^3.9.1",
"jspm": "^0.16.33",
"typescript": "^1.8.10"
},
"jspm": {
"moment": "npm:moment@^2.12.0"
}
}
Następnie mam taką klasę Typescript main.js
:
import moment from 'moment';
export class Main {
}
Mój gulpfile.js
wygląd wygląda tak:
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'));
});
Kiedy uruchamiam kompilację z łyka, otrzymuję komunikat: "../main.ts(1,25): Cannot file module 'moment'."
Jeśli używam, import moment = require('moment');
jspm zadziała i wprowadzi moduł po uruchomieniu aplikacji, ale nadal otrzymuję błąd kompilacji. Próbowałem też:
npm install typings -g
typings install moment --ambient --save
Jednak zamiast poprawić sytuację, pogorszył się. Teraz pojawia się powyższy błąd podczas kompilacji, a także następujący:"../typings/browser/ambient/moment/index.d.ts(9,21): Cannot find namespace 'moment'."
Jeśli przejdę do pliku dostarczonego przez wpisywanie i dodam na dole pliku:
declare module "moment" { export = moment; }
Mogę usunąć drugi błąd, ale nadal potrzebuję instrukcji wymagania, aby mieć chwilę do pracy w moim main.ts
pliku i nadal otrzymuję pierwszy błąd kompilacji.
Czy muszę .d.ts
na chwilę utworzyć własny plik, czy brakuje mi tylko jakiegoś elementu konfiguracyjnego?
źródło
import moment, { Moment } from 'moment';
const x = moment();
const x: Moment = moment();
Odpowiedzi:
Aktualizacja
Najwyraźniej moment dostarcza teraz własne definicje typów (zgodnie z sivabudh co najmniej od 2.14.1 wzwyż), więc nie potrzebujesz ich
typings
lub@types
wcale.import * as moment from 'moment'
powinien załadować definicje typu dostarczone z pakietem npm.To powiedziawszy jednak, jak wspomniano w moment / pull / 3319 # issuecomment-263752265 w momencie, gdy wydaje się, że zespół ma problemy z utrzymaniem tych definicji (nadal szuka kogoś, kto je utrzymuje) .
Musisz zainstalować
moment
typy bez--ambient
flagi.Następnie dołącz go za pomocą
import * as moment from 'moment'
źródło
--ambient
flagi a nie? Mam numeraljs do pracy przy użyciu flagi otoczenia. Również ich strona główna npmjs.com/package/typings podaje przykład z użyciem flagi otoczenia. Nie wiem, kiedy chciałbym / musiałbym używać jednego nad drugim. Dzięki!--ambient
flagi dla wszystkich definicji Typescript ztypings
/,DefinitelyTyped
alemoment
definicja ma dziwną strukturę i pliki nie są ładowane poprawnie. Jeśli spojrzysz na plik definicji moment.d.ts , zawiera on tylko odniesienie do wersji węzła, które nie jest rozwiązane podczas pobierania (może warto otworzyć problem).Musisz zaimportować moment () funkcję i Moment klasę oddzielnie w TS.
Znalazłem notatkę w dokumentach maszynopisu tutaj .
Zatem kod importujący moment js do maszynopisu wygląda tak:
import { Moment } from 'moment' .... let moment = require('moment'); ... interface SomeTime { aMoment: Moment, } ... fn() { ... someTime.aMoment = moment(...); ... }
źródło
import * as moment from 'moment';
a następnie używaćmoment.Moment
do pisania.moment.Moment
interfejsu bezpośrednio z przestrzeni nazwmoment
Nie jestem pewien, kiedy to się zmieniło, ale w najnowszej wersji maszynopisu wystarczy użyć
import moment from 'moment';
i wszystko inne powinno działać normalnie.AKTUALIZACJA:
Wygląda na to, że ostatnio naprawiono ich import. Przynajmniej
2.24.0
będziesz chciał użyćimport * as moment from 'moment';
źródło
import * as moment from 'moment'
nie działa z maszynopisem, aleimport moment from 'moment'
działa.esModuleInterop
zestawutrue
w mojej konfiguracji, który otrzymałem z tej odpowiedzi . Dzięki.za pomocą maszynopisów
Moment.js obsługuje teraz język TypeScript w wersji 2.14.1.
Zobacz: https://github.com/moment/moment/pull/3280
Bezpośrednio
Może nie jest to najlepsza odpowiedź, ale to metoda brutalnej siły i działa na mnie.
moment.js
plik i umieść go w swoim projekcie.$ tree . ├── main.js ├── main.js.map ├── main.ts └── moment.js
`` ''
import * as moment from 'moment'; class HelloWorld { public hello(input:string):string { if (input === '') { return "Hello, World!"; } else { return "Hello, " + input + "!"; } } } let h = new HelloWorld(); console.log(moment().format('YYYY-MM-DD HH:mm:ss'));
node
biegnijmain.js
.źródło
Właśnie zauważyłem, że odpowiedź, za którą głosowałem i skomentowałem, jest niejednoznaczna. Oto dokładnie to, co zadziałało dla mnie. Obecnie korzystam z Moment
2.26.0
i TS3.8.3
:W kodzie:
import moment from 'moment';
W konfiguracji TS:
{ "compilerOptions": { "esModuleInterop": true, ... } }
Buduję zarówno dla CommonJS, jak i EMS, więc ta konfiguracja jest importowana do innych plików konfiguracyjnych.
Wgląd pochodzi z tej odpowiedzi, która dotyczy korzystania z Express. Pomyślałem, że warto to tutaj dodać, aby pomóc każdemu, kto szuka w związku z Moment.js, zamiast czegoś bardziej ogólnego.
źródło
moment()
jak zwykle zamiastmoment.default()
1. zainstalować moment
2. Przetestuj ten kod w swoim pliku maszynopisu
import moment = require('moment'); console.log(moment().format('LLLL'));
źródło
Nadal zepsuty? Spróbuj odinstalować
@types/moment
.Więc usunąłem
@types/moment
pakiet zpackage.json
pliku i działał przy użyciu:import * as moment from 'moment'
Nowsze wersje
moment
nie wymagają@types/moment
pakietu, ponieważ typy są już uwzględnione.źródło