1. ホーム
  2. typescript

[解決済み] typescriptでmoment.jsをインポートするには?

2022-10-17 23:57:59

質問

Typescriptを学ぼうとしています。関係ないとは思いますが、このデモではVSCodeを使っています。

私は package.json の中に、このような断片があります。

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

次に、Typescriptのクラス main.js をこのようにします。

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'."

typingsから提供されたファイルに移動して、ファイルの一番下に追加すると。

declare module "moment" { export = moment; }

2つ目のエラーは解消されましたが、momentを動作させるためには、まだrequire文が必要で、私の main.ts ファイル内で動作させるために require 文が必要で、まだ最初のビルドエラーが発生しています。

を自分で作成する必要がありますか? .d.ts ファイルを作成する必要があるのでしょうか、それとも私が見逃している設定部分があるのでしょうか?

どのように解決するのですか?

更新

どうやら、momentは独自の型定義を提供するようになったようです(曰く sivabudh によると、少なくとも 2.14.1 以降では)、このため typings または @types を全く含まない。

import * as moment from 'moment' は、npmパッケージで提供される型定義を読み込む必要があります。

しかし、そうは言っても moment/pull/3319#issuecomment-263752265 moment チームはこれらの定義を維持する上でいくつかの問題を抱えているようです (彼らはまだそれらを維持する誰かを探しています)。 .


インストールする必要があるのは moment 型付けは --ambient のフラグがありません。

そして、それを import * as moment from 'moment'