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
ようなものを使用する唯一の選択肢はありますか?
私は同じ問題に直面しています。 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
フォルダーの下だけを見ています。 したがって、基本的にこれらのオプションがあります。
moment.d.ts
の下にnode_modules/@types/moment
/// <reference path="./node_modules/moment/moment.d.ts" />
を.ts
ファイルに含めますtsc --typeRoots node_modules test.ts
電話する./node_modules/moment/moment.d.ts
にfiles
のセクションtsconfig.json
また、 export as namespace moment;
をmoment.d.ts
ファイルに追加する必要があります。
Momentチームは、これを修正するPRを気に入っていますが、TS1.xとの互換性を維持しています。
私はまだまったく機能する解決策を見つけていませんが、私がそうするとき、私は必ずPRを追加します
#3663によると、バンドラーなしで動作させるための一時的な修正...
moment.d.ts
をnode_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.json
。 moment.custom.d.ts
、それをコンパイラーに追加したことを確認してください。宣言した余分なものはありません。 次に、使用するファイルの先頭で参照していることを確認します。
/// <reference path="path/to/your/moment.custom.d.ts" />
これにより、元の回避策のように、グローバル変数として参照できるようになります。
素晴らしいありがとう@mtgibbs ! 私は本当に助けに感謝します。
パスをサポートするようにファイル構造を変更しました。 したがって、これらは正しいパスです。
歓声メイト!
これは私のために働きます:
// export = moment
をコメントアウトするnode_modules/moment/moment.d.ts
をtsconfig.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
関数のみをインポートし、名前空間/タイプはインポートしないことに気づきました。 したがって、モーメントオブジェクトを関数に渡したい場合は、次のようになります。
この問題を再度開いてください。それ以上の場合は、.dtsファイルを修正してください。
元の問題の解決策ではありませんが、後でこれをグーグルで検索する人のために:tsconfig.jsonで次のように指定すると修正されました(タイプスクリプト3.3.3およびモーメント2.24.0)
{
"compilerOptions": {
"module": "commonjs"
}
}
最近はモーメントをあまり使用していませんが、それでも有効な場合は、問題を再開できてうれしいです。
これに対する解決策は何ですか?
@nagipoguその解決策はありません。この問題はmoment.jsに関するものですのGithubリポジトリで問題を開いてください。
最新バージョンのTSで最新バージョンのmomentでこの問題が発生しています。 誰かが成功した回避策を持っていますか?
まだ機能していませんが、私にとっての解決策はyarn add -W [email protected]
。
最新のmomentバージョンをインストールしてnode_modules / moment / package.jsonを調べたところ、 https : node_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を使用すると、再び軌道に戻ります。
わかりました、すばらしい。 とりあえず閉店します。
それでも懸念がある場合は、再度開いてください(または新しい問題を開いてください)。
最も参考になるコメント
+1これを修正してください