Moment: [TypeScript]「エラーTS2304:「モジュール」と一緒に使用すると名前「モーメント」が見つかりません」:「なし」

作成日 2017年02月14日  ·  51コメント  ·  ソース: moment/moment

Typescriptは、モジュール以外のコンテキストで使用された場合、グローバルmoment()関数を解決できないようです。

tscバージョン:2.1.6
モーメントバージョン:2.17.1

再現( tsc$PATH仮定):

$ mkdir repro && cd repro
$ npm i moment
$ echo 'const now = moment();' > test.ts
$ tsc --module none test.ts
test.ts(1,13): error TS2304: Cannot find name 'moment'.

ただし、モジュールタイプの使用は期待どおりに機能します。

$ echo 'import * as moment from "moment"; const now = moment();' > test2.ts
$ tsc --module commonjs test2.js

残念ながら、私のプロジェクトはバンドラーやモジュールシステムを使用していないので、今のところ"module": "none"で立ち往生しています。

typings install --save --global dt~momentようなものを使用する唯一の選択肢はありますか?

TypeScript Up-For-Grabs

最も参考になるコメント

+1これを修正してください

全てのコメント51件

私は同じ問題に直面しています。 tsconfig.jsonで指定するモジュールタイプは関係ありません。 @rossipediaと同じエラーが発生し

同じ問題(https://github.com/moment/moment/issues/3663)を報告しましたが、残念ながら、何の反応もなく閉じられました。

最終的にmoment.d.ts/scripts/appディレクトリにコピーし、 https: //github.com/moment/moment/issues/3663#issuecomment-273199291で指定された修正を実装しました

うまくいけば、より恒久的な修正が最終的にmoment.d.tsに入るでしょう。

tsconfigで"moduleResolution": "node"を指定することで、これを解決しました。 これが皆さんにとっての選択肢かどうかはわかりませんが、うまくいくようです。

"moduleResolution": "node"は、残念ながら私のためにそれを修正しません

@rossipedia私も。

export as namespace moment;moment.d.tsファイルに追加するのは役に立ちませんか?

参照: https

@czbも問題を解決しませんでしたが、残念ながら:(

私は、この問題を抱えている多くのプロジェクトで他の人がたくさんの問題について言及しているいくつかのハックを使用してこれを解決しました。 独自のカスタム定義ファイルにまとめるだけです。 これはTypescript2.2を使用しています。 このようにして、npmjs.orgからの依存関係をいじくり回すことがなく、すべてをソース管理にチェックインする必要がありません。

tsconfig.json

"compilerOptions": {
    "target": "ES5",
    "moduleResolution": "node",
    ...
}

moment.custom.d.ts

import * as _moment from 'moment';
export as namespace moment;
export = _moment;

そのコードがmoment.d.ts直接追加されたときに、なぜそれが機能しないのか知りたいのですが? TypeScriptの解決に関するあいまいなバグに突き当たっていると思わずにはいられません。残念ながら、 tscは、問題が発生している場所を特定するのに役立つ詳細モード(私が知っている)がありません。

"module": "none"を定義すると、typescriptはnode_modules/momentフォルダーの下のd.tsファイルを検索しないと思います。 私の経験では、 node_modules/@typesフォルダーの下だけを見ています。 したがって、基本的にこれらのオプションがあります。

  1. コピーmoment.d.tsの下にnode_modules/@types/moment
  2. /// <reference path="./node_modules/moment/moment.d.ts" />.tsファイルに含めます
  3. tsc --typeRoots node_modules test.ts電話する
  4. 入れて./node_modules/moment/moment.d.tsfilesのセクションtsconfig.json

また、 export as namespace moment;moment.d.tsファイルに追加する必要があります。

Momentチームは、これを修正するPRを気に入っていますが、TS1.xとの互換性を維持しています。

私はまだまったく機能する解決策を見つけていませんが、私がそうするとき、私は必ずPRを追加します

#3663によると、バンドラーなしで動作させるための一時的な修正...

  • moment.d.tsnode_modules/moment/からnode_modules/@types/momentコピーします

  • moment.d.ts export = moment;に変更します

declare module "moment" {
    export = moment;
}
  • moment.d.ts名前をindex.d.ts

モーメントを使用するだけで、エディター(私の場合はvscode)とtscは文句を言うべきではありません

+1これを修正してください

@mtgibbs moment.custom.d.tsファイルをどこに置いていますか? アプリがこのcustom.d.tsファイルを見つけるために必要な他の構成はありますか?

@elSteeze

ええ、私はそれらを私のtsconfig.json追加しています。 スクラブした例を次に示します。

{
  "compilerOptions": {
    "target": "ES5",
    "moduleResolution": "node",
    "typeRoots": [
      "./node_modules/@types"
    ]
  },
  "compileOnSave": true,
  "exclude": [
    "node_modules",
    "./path/to/typings/**/*.d.ts",
    "./typings"
  ],
  "include": [
    "./path/to/typings/moment.custom.d.ts",
    "./path/to/src/**/*.ts"
  ]
}

@mtgibbsやあ、ありがとう! 迅速な返信に感謝します。 やってみます。

@mtgibbs別のnoobのような質問で申し訳ありませんが、ソリューションを実装した後、tsコードのmomentキーワードでエディターエラーが発生し始めました...

'moment' refers to a UMD global, but the current file is a module. Consider adding an import instead

私はいくつかの個人的な調査を行い、moment.custom.d.tsを書き直して解決策を実装しようとしましたが、残念ながら、それでも問題は解決しませんでした。

申し訳ありませんが、他のすべての人にコードをデバッグさせる厄介な開発者の1人になろうとはしていません。私は最近の卒業生であり、Angular2環境でサードパーティライブラリを操作するのは初めてです。

これが私の更新されたmodule.custom.d.tsです

declare var moment: any;
declare var module: NodeModule;
interface NodeModule {
    id: string;
}
import * as _moment from 'moment';
export as namespace moment;
export = _moment;

問題ない。 Angular 2を使用している場合は、2.0以降のTSを使用している必要があります。 私はAngularで働いていないので、よくわかりません。 tsconfig.jsonにできることを貼り付けてください。実際のコンピューターに戻ったら、確認します。

もちろん!

これは、構築しているAngular2モジュールのsrcディレクトリ内にあるtsconfig.es5.jsonファイル全体です。
ちなみに助けてくれてありがとう

{
  "compilerOptions": {
    "declaration": true,
    "module": "es2015",
    "target": "es5",
    "baseUrl": ".",
    "stripInternal": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "moduleResolution": "node",
    "outDir": "../build",
    "rootDir": ".",
    "lib": [
      "es2015",
      "dom"
    ],
    "skipLibCheck": true,
    "typeRoots": [
      "./node_modules/@types"
    ]
  },
  "compileOnSave": true,
  "exclude": [
    "node_modules",
    "./typings/**/*.d.ts",
    "./typings"
  ],
  "include": [
    "./typings/moment.custom.d.ts",
    "./src/**/*.ts"
  ],
  "angularCompilerOptions": {
    "annotateForClosureCompiler": true,
    "strictMetadataEmit": true,
    "skipTemplateCodegen": true,
    "flatModuleOutFile": "new-version-library.js",
    "flatModuleId": "new-version-library"
  },
  "files": [
    "./index.ts"
  ]
}

どのバージョンのTSをコンパイルしていますか? 私のハックなしで、トップの瞬間をインポートできるはずです。

@mtgibbs私はv2.2を使用しています、そしてそれは私が思ったものです。 残念ながら、それは機能していません。 私は、momentjsから取得している機能の独自のバージョンを作成する段階に近づいています。これは、これを機能させることができないように思われるためです。

@elSteeze

はい、ここに戻ります。 私はあなたがカスタム作ったと言ったことに気づいたmodule.custom.d.ts 、しかし、あなたは私を参照してくださいmoment.custom.d.tsあなたにtsconfig.jsonmoment.custom.d.ts 、それをコンパイラーに追加したことを確認してください。宣言した余分なものはありません。 次に、使用するファイルの先頭で参照していることを確認します。

/// <reference path="path/to/your/moment.custom.d.ts" />

これにより、元の回避策のように、グローバル変数として参照できるようになります。

素晴らしいありがとう@mtgibbs ! 私は本当に助けに感謝します。
パスをサポートするようにファイル構造を変更しました。 したがって、これらは正しいパスです。
歓声メイト!

これは私のために働きます:

  • 公式のmoment.d.tsファイルで// export = momentをコメントアウトする
  • node_modules/moment/moment.d.tstsconfig.json追加します

または、変更したmoment.d.tsを選択した場所にコピーし、そのパスをtsconfig.json追加します。

主な問題は、tsconfig.jsonで"module":"none"を明示的に使用する場合、ライブラリでトップレベルのインポートまたはエクスポートを行うことができないことです(モジュールを使用しているため)。

最初にコンポーネントを次のようにインポートする必要があります
「瞬間」からの瞬間として*をインポートします。

それは私にとってうまくいきました

最初にコンポーネントを次のようにインポートする必要があります
「瞬間」からの瞬間として*をインポートします。
それは私にとってうまくいきました

ファイルでこれを行うと、そのファイルの名前空間解決が無効になります。

これを修正するためにPlsみんな+1

この問題を修正してみませんか? それは非常に重要です。

"module": "commonjs"tsconfig.json追加すると、修正されました

しかし、私は"module": "none"を使用する必要があります。 Commonjsはソリューションではありません。

私が正しく理解していれば、これはTypeScript 2.9のインポートタイプ機能で解決されます。これにより、モジュール/アンビエントコンテキストに影響を与えることなくタイプ定義をimportすることができます。

TS 3.0.1を使用していますが、これは解決されましたか? 少なくとも箱から出しては機能しません。

編集、TS 3.0.1で私はこれを行うことができました:

declare var moment: typeof import("moment");

やあ!

tsconfigを使用

{
    "compilerOptions": {
        "module": "none"
        "moduleResolution": "node", 
        // ...
    }
}

TS 3.0.1はこの問題を修正しているようです(そして、1年半以上開いていて牽引力がありません)

こんにちはrossipedia、
私はangular-6プロジェクトで同じ問題に直面しています。 コメントによると、TS 3.0.1で解決されていますが、angular6CLIはTypeScriptバージョン3.0.1をサポートしていません。

この問題の解決にご協力いただけますか?

他の誰かも、単なるスタブであり、通常のモーメントパッケージによって提供されるファイルを使用するように指示する@types/moment npmパッケージに遭遇しましたか?

...なぜmomentは他のすべてのパッケージとは異なる方法でそれを行わなければならないのですか? これがこの問題が存在する理由であり、これに苦労している開発者は何千時間も費やしました。

もちろん、 @ Cianticのソリューションはdeclare var moment: typeof import("moment");ようなものを使用する必要はありません。

Typescript 3.0.1でその問題が修正されたようには見えませんが、回避策が提供されているようです。

回避策を提供しているようです。

うん、まさにこれだ。 これは許容できる「修正」ではありません。

たった1日で、TS 3.0.1の回避策はmoment関数のみをインポートし、名前空間/タイプはインポートしないことに気づきました。 したがって、モーメントオブジェクトを関数に渡したい場合は、次のようになります。

image

この問題を再度開いてください。それ以上の場合は、.dtsファイルを修正してください。

元の問題の解決策ではありませんが、後でこれをグーグルで検索する人のために:tsconfig.jsonで次のように指定すると修正されました(タイプスクリプト3.3.3およびモーメント2.24.0)

{
  "compilerOptions": {
    "module": "commonjs"
  }
}

最近はモーメントをあまり使用していませんが、それでも有効な場合は、問題を再開できてうれしいです。

src / app / services / get-list.service.ts(22,54)のエラー:エラーTS2304:名前 '_'が見つかりません。

これに対する解決策は何ですか?

@nagipoguその解決策はありません。この問題はmoment.jsに関するものですのGithubリポジトリで問題を開いてください。

最新バージョンのTSで最新バージョンのmomentでこの問題が発生しています。 誰かが成功した回避策を持っていますか?

まだ機能していませんが、私にとっての解決策はyarn add -W [email protected]

最新のmomentバージョンをインストールしてnode_modules / moment / package.jsonを調べたところ、 httpsnode_modules/moment/ts3.1-typingsなので、TSがそれを見つけられないのは当然のことです。 インストールスクリプト(またはパッケージ)などにバグがあるのではないかと思います。 はい、tsconfig.jsonに"module": "esnext"があります。

私にとっては2.25.0で壊れました:

私はpnpm追加使用[email protected]一時的な回避策として。

私にとっては2.25.0で壊れました:

私はpnpm追加使用[email protected]一時的な回避策として。

うまくいきます、ありがとう

私にとっては2.25.0で壊れました:

私はpnpm追加使用[email protected]一時的な回避策として。

ここで同じものを追加しました: "dependencies" {"moment": "^ 2.24.0"、
} ...動作しているようですありがとうございます。

2.24.0へのダウングレードもうまくいきました。 2.25.0でのリグレッションのように見えます。

2.25.3で問題は解決しましたか?

TS 1.x、TS 2.x、TS 3.xはもちろん、Moment.jsが使用される状況にはさまざまな種類があります。
これらのユーザーのグループを壊すような変更を加えることを躊躇しています。

ドキュメントを改善できると思われる場合は、 https://github.com/moment/momentjs.com/に投稿して

2.25.3で問題は解決しましたか?

はい。

Angular 9で2.25.1が失敗したときに、2.24.0にロールバックしました。2.25.3を使用すると、再び軌道に戻ります。

わかりました、すばらしい。 とりあえず閉店します。

それでも懸念がある場合は、再度開いてください(または新しい問題を開いてください)。

このページは役に立ちましたか?
0 / 5 - 0 評価