Moment.js, typcript ile nasıl içe aktarılabilir?


96

Typescript öğrenmeye çalışıyorum. Alakalı olduğunu düşünmüyorum, ancak bu demo için VSCode kullanıyorum.

Bir var package.jsononun içinde bu parçaları vardır:

{
  "devDependencies": {
    "gulp": "^3.9.1",
    "jspm": "^0.16.33",
    "typescript": "^1.8.10"
  },
  "jspm": {
    "moment": "npm:moment@^2.12.0"
  }
}

Sonra bunun gibi bir Typescript sınıfım var main.js:

import moment from 'moment';
export class Main {
}

Benim gulpfile.jsşuna benziyor:

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'));
});

Gulp build çalıştırdığımda şu mesajı alıyorum: "../main.ts(1,25): Cannot file module 'moment'."

Ben kullanırsanız import moment = require('moment');o zaman jspm çalışacak ve Uygulamayı çalıştırdığınızda modülünde getirmek, ama yine de inşa hatası alıyorum. Ben de denedim:

npm install typings -g
typings install moment --ambient --save

Sorunu daha iyi hale getirmek yerine, daha da kötüleşti. Şimdi, yukarıdaki hatanın yanı sıra aşağıdakileri de alıyorum:"../typings/browser/ambient/moment/index.d.ts(9,21): Cannot find namespace 'moment'."

Yazılarla sağlanan dosyaya gidip dosyanın altına eklersem:

declare module "moment" { export = moment; }

İkinci hatayı ortadan kaldırabilirim, ancak hala çalışmam için gerekli ifadesine ihtiyacım var. main.ts ve yine de ilk derleme hatasını alıyorum.

.d.tsŞu an için kendi dosyamı oluşturmam gerekiyor mu yoksa eksik olduğum bazı kurulum parçaları mı var?


1
Bu güncellemeyi şimdi import moment, { Moment } from 'moment';const x = moment();const x: Moment = moment();
bununla karşılaşan

Bu çözümlerden hiçbiri işe yaramadı, buraya taşındım - github.com/date-fns/date-fns
chrismarx

Yanıtlar:


124

Güncelleme

Görünüşe göre, moment artık kendi tip tanımlarını sağlıyor ( sivabudh'a göre en az 2.14.1'den itibaren), dolayısıyla ihtiyacınız yok typingsya da@types hiç.

import * as moment from 'moment' npm paketi ile sağlanan tür tanımlarını yüklemelidir.

Bununla birlikte, şu anda söylendiği gibi / pull / 3319 # issuecomment-263752265 , şu anda ekibin bu tanımları sürdürmede bazı sorunları var gibi görünüyor (hala onları koruyan birini arıyorlar) .


momentYazıları yüklemeniz gerekir .--ambient .

Sonra bunu kullanarak ekleyin import * as moment from 'moment'


İşe yaradı. --ambientBayrağı kullanmakla kullanmamak arasındaki farkı açıklayabilir misiniz ? Ortam bayrağını kullanarak çalışacak j'ler aldım. Ayrıca, ana sayfaları npmjs.com/package/typings , ortam bayrağını kullanarak örnek verir. Birini diğerine ne zaman kullanmak isteyeceğimi / kullanmam gerektiğini bilmiyorum. Teşekkürler!
Peinearydevelopment

1
Dürüst olmak gerekirse yapamam. Normalde / --ambientdan tüm Typescript tanımları için bayrağı kullanırsınız, ancak tanımın bazı garip yapıları vardır ve dosyalar doğru indirilmez. Moment.d.ts tanım dosyasına bakarsanız , yalnızca indirme sırasında çözülmeyen düğüm sürümüne bir referans içerir (bir sorunu açmaya değer olabilir). typingsDefinitelyTypedmoment
Yardımcıları

Görünüşe göre bu sorunla ilgili zaten bir tane var: github.com/DefinitelyTyped/DefinitelyTyped/issues/8388
peinearydevelopment

1
Düğüm modülleri klasöründe bir alt klasör olarak yüklendiği 'an / an'dan itibaren içe aktar * kullanarak çalışmasını sağladım.
user441058

1
Bir web paketindeyim ve 2.17.1 sürümünün anındayım, ancak yine de çalıştıramıyorum. Denedim: 'an'dan * an olarak içe aktar; ve * 'an / andan itibaren an olarak içe aktarılır; ve çalışmıyor!
Mohy Eldeen

59

Moment () işlevi ve Moment sınıfı TS'de ayrı ayrı içe aktarmanız gerekir .

Buradaki daktilo belgelerinde bir not buldum .

/ * ~ ES6 modüllerinin çağrılabilir işlevleri doğrudan dışa aktaramayacağını unutmayın
* ~ Bu dosya CommonJS stili kullanılarak içe aktarılmalıdır:
* ~ import x = required ('someLibrary');

Dolayısıyla, js momentini typcript'e aktaran kod aslında şu şekilde görünür:

import { Moment } from 'moment'
....
let moment = require('moment');
...
interface SomeTime {
  aMoment: Moment,
}
...
fn() {
  ...
  someTime.aMoment = moment(...);
  ...
}

1
Tür ve işlev arasındaki farkı gösterdiği için iyi yanıt. Teşekkürler!
Jelle den Burger

'gerekli' adı bulunamıyor
Kodlu Konteyner

4
Şimdi bu olarak kullanılabilir import * as moment from 'moment';ve daha sonra moment.Momentyazı yazmak için kullanılabilir.
meteor

Benim için işe yarayan şey şuydu: içe aktarma momenti = gerekli ('an');
Telmo Pimentel Mota

Aslında moment.Momentarayüzü doğrudan ad alanından da kullanabilirsinizmoment
HalfWebDev

20

Bunun ne zaman değiştiğinden emin değilim, ancak en son typcript sürümüyle, sadece kullanmanız gerekir import moment from 'moment';ve diğer her şey normal şekilde çalışmalıdır.

GÜNCELLEME:

Görünüşe göre yakın zamanda ithalatlarını düzeltti. En azından 2.24.0kullanmak isteyeceksinizimport * as moment from 'moment';


5
import * as moment from 'moment'typcript ile çalışmayacak ama çalışıyor import moment from 'moment'.
Stuart McIntyre

Çalışıyor ama GMT 0'ın zamanını alıyorum, ancak çalışmayan yerel saate ihtiyacım var ayrıca moment (). Utc (). Format () ile de deniyorum ama aynı sonucu döndürüyor.
kbhaskar

@kbhaskar son sürüm itibariyle içe aktarımlarını düzelttiler. Güncellenmiş yanıtı görün
NSjonas

1
Bence bu hemen hemen o. Yapmam gereken tek ek adım , yapılandırmamda bu yanıttan aldığım esModuleInteropküme eklemek oldu . Teşekkürler. true
Mark Birbeck

14

yazı yoluyla

Moment.js artık v2.14.1'de TypeScript'i destekliyor.

Bakınız: https://github.com/moment/moment/pull/3280


Direkt olarak

En iyi cevap olmayabilir ama bu kaba kuvvet yolu ve benim için işe yarıyor.

  1. Sadece gerçek olanı indirin moment.js dosyayı indirin ve projenize ekleyin.
  2. Örneğin projem şöyle görünüyor:

$ tree . ├── main.js ├── main.js.map ├── main.ts └── moment.js

  1. Ve işte örnek bir kaynak kodu:

''

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'));
  1. Sadece nodekoşmak için kullan main.js.

Evet, bunun doğru yanıt olduğunu onaylıyorum. Bir cazibe gibi çalıştı.
Capy

Bunu npm i @ types / moment kullanarak yapmaya çalıştığımda, bir hata alıyorum: TypeScript hatası: src \ app.ts (1,1): hata TS7038: Ad alanı tarzı içe aktarma çağrılamaz veya oluşturulamaz ve neden olur çalışma zamanında bir hata. tsc -v 2.7.2'de
GONeale

2

Oy verdiğim ve yorum yaptığım cevabın belirsiz olduğunu fark ettim. Yani aşağıdaki benim için tam olarak işe yarayan şeydi. Şu anda Moment 2.26.0ve TS'deyim3.8.3 :

Kodda:

import moment from 'moment';

TS yapılandırmasında:

{
  "compilerOptions": {
    "esModuleInterop": true,
    ...
  }
}

İkisi için inşa ediyorum bu yapılandırma diğer yapılandırma dosyalarına aktarılır böylece CommonJS ve EMS.

İçgörü, Express kullanımıyla ilgili bu cevaptan gelir . Daha genel bir şey yerine Moment.js ile ilgili arama yapan herkese yardımcı olmak için buraya eklemeye değer olduğunu düşündüm.


o zaman moment()yerine normal gibi kullanabilirsinizmoment.default()
03'te xinthose


0

Hala kırık? Kaldırmayı deneyin@types/moment .

Bu yüzden, @types/momentpaketi package.jsondosyadan kaldırdım ve şunu kullanarak çalıştı:

import * as moment from 'moment'

Daha yeni sürümleri, türler zaten dahil edildiği momentiçin @types/momentpaketi gerektirmez .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.