typescriptを使用してmoment.jsをインポートするにはどうすればよいですか?


93

私はTypescriptを学ぼうとしています。妥当ではないと思いますが、このデモではVSCodeを使用しています。

package.jsonはこれらの部分を持っているものを持っています:

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

次に、次のmain.jsようなTypescriptクラスがあります。

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

gulpfile.jsはこのように見えます:

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を実行すると、次のメッセージが表示されます。 "../main.ts(1,25): Cannot file module 'moment'."

私が使用する場合import moment = require('moment');、jspmは動作し、アプリケーションを実行するとモジュールを取り込みますが、それでもビルドエラーが発生します。私も試しました:

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

しかし、問題を改善する代わりに、問題は悪化しました。これで、ビルド時に上記のエラーに加えて、次のエラーが発生します。"../typings/browser/ambient/moment/index.d.ts(9,21): Cannot find namespace 'moment'."

入力によって提供されたファイルに移動し、ファイルの下部に追加する場合:

declare module "moment" { export = moment; }

2番目のエラーを解消することはmain.tsできますが、ファイルで作業する瞬間を得るにはrequireステートメントが必要ですが、最初のビルドエラーが発生します。

.d.tsしばらくの間自分でファイルを作成する必要がありますか、それとも不足しているセットアップピースがありますか?


今、このに走る人のためにこの更新プログラムを追加する:import moment, { Moment } from 'moment';あなたがすることができますconst x = moment();const x: Moment = moment();
ryuu9187

これらのソリューションはどれも機能しなかったため、ここに移動しました-github.com/date-fns/date-fns
chrismarx

回答:


119

更新

どうやら、momentは独自の型定義を提供するようになりました(少なくとも2.14.1 以降のsivabudhによる)。そのため、必要ないtypings@types、まったく必要ありません。

import * as moment from 'moment' npmパッケージで提供されるタイプ定義をロードする必要があります。

ただし、moment / pull / 3319#issuecomment-263752265で述べたように、瞬間チームはそれらの定義の維持にいくつかの問題を抱えているようです(彼らはまだそれらを維持している人を探しています)


フラグmomentなしでタイピングをインストールする必要があり--ambientます。

次に、それを使用してそれを含めます import * as moment from 'moment'


うまくいきました。--ambientフラグを使用することとしないことの違いを説明できますか?アンビエントフラグを使用してnumericjsを動作させました。また、メインページnpmjs.com/package/typingsには、環境フラグを使用した例が示されています。どちらを使いたいか、いつ使う必要があるかわかりません。ありがとう!
peinearydevelopment

1
正直言って、私にはできません。通常--ambienttypings/ からのすべてのTypescript定義にフラグを使用しますDefinitelyTypedが、moment定義に奇妙な構造があり、ファイルが正しくダウンロードされません。定義ファイルmoment.d.tsを見ると、ダウンロード時に解決されないノードバージョンへの参照のみが含まれています(問題を開く価値があるかもしれません)。
2016

どうやらこの問題に関連するものはすでにある:github.com/DefinitelyTyped/DefinitelyTyped/issues/8388
peinearydevelopment

1
'moment / moment' b / cからの瞬間としてimport *を使用して動作させました。node-modulesフォルダーのサブフォルダーとしてインストールされました。
user441058

1
私はWebpackを使用していて、バージョン2.17.1を使用していますが、それでも機能しません。私が試してみました:「瞬間」から瞬間としてインポート*; そして、「瞬間/瞬間」から瞬間として*をインポートします。動作していません!
Mohy Eldeen 2017年

58

あなたは輸入に必要な瞬間()関数とモーメント TSでクラス分けて。

私はここのtypescriptドキュメントにメモを見つけました。

/ *〜ES6モジュールは呼び出し可能な関数を直接エクスポートできないことに注意してください
*〜このファイルはCommonJSスタイルを使用してインポートする必要があります:
*〜import x = require( 'someLibrary');

したがって、モーメントjsをtypescriptにインポートするコードは、実際には次のようになります。

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

1
タイプと関数の違いを示しているので良い答えです。ありがとう!
Jelle

「require」という名前が見つかりません
コード化されたコンテナ

4
これは、としてimport * as moment from 'moment';使用できmoment.Moment、タイピングに使用できます。
流星

私のために働いたのは:import moment = require( 'moment');
Telmo Pimentel Mota

実際moment.Moment、名前空間から直接インターフェイスを使用することもできますmoment
HalfWebDev

19

これがいつ変更されたかはわかりませんが、typescriptの最新バージョンでは、使用するだけでimport moment from 'moment';他はすべて正常に機能します。

更新:

最近インポートを修正した瞬間のようです。少なくとも2.24.0あなたは使いたいでしょうimport * as moment from 'moment';


5
import * as moment from 'moment'typescriptではimport moment from 'moment'機能しませんが、機能します。
スチュアートマッキンタイア

それは動作していますが、GMT 0の時刻を取得していますが、動作していない現地時間が必要です。また、moment()。utc()。format()で試してみますが、同じ結果を再取得しています。
kbhaskar

@kbhaskarは、インポートを修正した最新バージョンの時点のものです。更新された回答を見る
NSjonas

1
私はこれがほとんどそれだと思います。私がしなければならなかった唯一の追加の手順は、この回答から得esModuleInteropられtrueた私の設定にsetを追加することでした。ありがとう。
Mark Birbeck

14

タイピングを介して

Moment.jsは、v2.14.1でTypeScriptをサポートするようになりました。

参照:https : //github.com/moment/moment/pull/3280


直接

最善の答えではないかもしれませんが、これは力ずくの方法であり、私にとってはうまくいきます。

  1. 実際のmoment.jsファイルをダウンロードして、プロジェクトに含めてください。
  2. たとえば、私のプロジェクトは次のようになります。

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

  1. そして、ここにサンプルのソースコードがあります:

「」

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. を使用nodeして実行しますmain.js

はい、これは正解です。魅力のように働いた。
Capy

npm i @ types / momentを使用してこれを実行しようとすると、次のエラーが表示されます:TypeScriptエラー:src \ app.ts(1,1):エラーTS7038:名前空間スタイルのインポートを呼び出したり構築したりできず、実行時の障害。on tsc -v 2.7.2
GONeale

1

私が賛成してコメントした答えがあいまいなことに気づきました。だから、以下はまさに私のために働いたものです。私は現在モーメント2.26.0とTSにい3.8.3ます:

コードで:

import moment from 'moment';

TS構成:

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

CommonJSとEMSの両方を構築しているので、この構成は他の構成ファイルにインポートされます。

洞察は、Expressの使用に関連するこの回答から得られます。ただし、より一般的なものではなく、Moment.jsに関連して検索する人を助けるために、ここに追加する価値があると考えました。


その後、moment()代わりに通常のように使用できますmoment.default()
xinthose

0

1.インストールの瞬間

npm install moment --save

2. typescriptファイルでこのコードをテストします

import moment = require('moment');

console.log(moment().format('LLLL'));

1
これは、typescriptでモジュールをインポートする適切な方法ではありません。回答の更新をご検討ください。確認のためにこれを参照してください:basarat.gitbook.io/typescript/project/modules/external-modules
Efe Ariaroo

0

まだ壊れてる?をアンインストールしてみてください@types/moment

だから、私@types/momentpackage.jsonファイルからパッケージを削除し、それを使って動作しました:

import * as moment from 'moment'

タイプはすでに含まれているmomentため、の新しいバージョンでは@types/momentパッケージは必要ありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.