Saya mencoba mempelajari Ketikan. Meskipun menurut saya ini tidak relevan, saya menggunakan VSCode untuk demo ini.
Saya memiliki package.json
yang memiliki potongan-potongan ini di dalamnya:
{
"devDependencies": {
"gulp": "^3.9.1",
"jspm": "^0.16.33",
"typescript": "^1.8.10"
},
"jspm": {
"moment": "npm:moment@^2.12.0"
}
}
Lalu saya memiliki kelas Ketikan main.js
seperti ini:
import moment from 'moment';
export class Main {
}
Saya gulpfile.js
terlihat seperti ini:
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'));
});
Ketika saya menjalankan gulp build, saya mendapatkan pesan: "../main.ts(1,25): Cannot file module 'moment'."
Jika saya menggunakan import moment = require('moment');
maka jspm akan berfungsi dan membawa modul saat saya menjalankan aplikasi, tetapi saya masih menerima kesalahan pembuatan. Saya juga mencoba:
npm install typings -g
typings install moment --ambient --save
Alih-alih membuat masalah menjadi lebih baik, malah menjadi lebih buruk. Sekarang saya mendapatkan kesalahan di atas pada build serta yang berikut:"../typings/browser/ambient/moment/index.d.ts(9,21): Cannot find namespace 'moment'."
Jika saya pergi ke file yang disediakan oleh pengetikan dan menambahkan di bagian bawah file:
declare module "moment" { export = moment; }
Saya bisa mendapatkan kesalahan kedua untuk pergi, tetapi saya masih membutuhkan pernyataan yang diperlukan untuk mendapatkan waktu untuk bekerja di main.ts
file saya dan saya masih mendapatkan kesalahan pembuatan pertama.
Apakah saya perlu membuat .d.ts
file saya sendiri untuk sementara waktu atau hanya ada beberapa bagian penyiapan yang saya lewatkan?
sumber
import moment, { Moment } from 'moment';
memungkinkan Anda untuk melakukanconst x = moment();
danconst x: Moment = moment();
Jawaban:
Memperbarui
Rupanya moment sekarang memberikan definisi tipenya sendiri (menurut sivabudh minimal dari 2.14.1 ke atas), jadi anda tidak membutuhkan
typings
atau tidak membutuhkan@types
sama sekali.import * as moment from 'moment'
harus memuat definisi tipe yang disediakan dengan paket npm.Namun demikian, seperti yang dikatakan pada moment / pull / 3319 # Issuecomment-263752265 , tim moment tampaknya memiliki beberapa masalah dalam mempertahankan definisi tersebut (mereka masih mencari seseorang yang memeliharanya) .
Anda perlu menginstal
moment
pengetikan tanpa--ambient
bendera.Kemudian sertakan menggunakan
import * as moment from 'moment'
sumber
--ambient
bendera dan tidak? Saya mendapat numeraljs untuk bekerja menggunakan bendera ambient. Juga, halaman utama mereka npmjs.com/package/typings memberikan contoh penggunaan ambient flag. Saya tidak tahu kapan saya ingin / perlu menggunakan salah satunya. Terima kasih!--ambient
flag untuk semua definisi Typecript daritypings
/DefinitelyTyped
tetapimoment
definisi tersebut memiliki struktur yang aneh dan file tidak diunduh dengan benar. Jika Anda melihat file definisi moment.d.ts itu hanya berisi referensi ke versi node, yang tidak terselesaikan saat diunduh (mungkin layak membuka masalah).Anda perlu mengimpor moment () fungsi dan Momen kelas secara terpisah di TS.
Saya menemukan catatan di dokumen ketikan di sini .
Jadi kode untuk mengimpor momen js ke dalam skrip ketikan sebenarnya terlihat seperti ini:
import { Moment } from 'moment' .... let moment = require('moment'); ... interface SomeTime { aMoment: Moment, } ... fn() { ... someTime.aMoment = moment(...); ... }
sumber
import * as moment from 'moment';
dan kemudian digunakanmoment.Moment
untuk pengetikan.moment.Moment
antarmuka langsung dari namespacemoment
Tidak yakin kapan ini berubah, tetapi dengan versi skrip terbaru, Anda hanya perlu menggunakan
import moment from 'moment';
dan yang lainnya akan bekerja seperti biasa.MEMPERBARUI:
Sepertinya beberapa saat terakhir memperbaiki impor mereka. Setidaknya
2.24.0
Anda ingin menggunakanimport * as moment from 'moment';
sumber
import * as moment from 'moment'
tidak akan bekerja dengan skrip tetapi berfungsiimport moment from 'moment'
.esModuleInterop
set ketrue
dalam konfigurasi saya, yang saya dapatkan dari jawaban ini . Terima kasih.melalui pengetikan
Moment.js sekarang mendukung TypeScript di v2.14.1.
Lihat: https://github.com/moment/moment/pull/3280
Langsung
Mungkin bukan jawaban terbaik, tapi ini cara kekerasan, dan itu berhasil untuk saya.
moment.js
file sebenarnya dan sertakan dalam proyek Anda.$ 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
untuk larimain.js
.sumber
Saya baru saja memperhatikan bahwa jawaban yang saya beri suara positif dan dikomentari tidak jelas. Jadi berikut ini persis apa yang berhasil untuk saya. Saya saat ini di Momen
2.26.0
dan TS3.8.3
:Dalam kode:
import moment from 'moment';
Dalam konfigurasi TS:
{ "compilerOptions": { "esModuleInterop": true, ... } }
Aku membangun untuk kedua CommonJS dan EMS sehingga konfigurasi ini diimpor ke file konfigurasi lainnya.
Wawasan berasal dari jawaban ini yang berkaitan dengan penggunaan Express. Saya pikir itu layak ditambahkan di sini, untuk membantu siapa saja yang mencari terkait dengan Moment.js, daripada sesuatu yang lebih umum.
sumber
moment()
seperti biasa, bukanmoment.default()
1. pasang momen
2. uji kode ini dalam file skrip Anda
import moment = require('moment'); console.log(moment().format('LLLL'));
sumber
Masih rusak? Coba copot pemasangan
@types/moment
.Jadi, saya menghapus
@types/moment
paket daripackage.json
file dan bekerja menggunakan:import * as moment from 'moment'
Versi yang lebih baru
moment
tidak memerlukan@types/moment
paket karena jenis sudah disertakan.sumber