web-dev-qa-db-ja.com

モーメントタイプの定義をインポートする方法

このyeomanジェネレーターを使用してTypeScriptでangular 1プロジェクトを作成しました: https://github.com/FountainJS/generator-fountain-systemjs
SystemJSとjspmを使用して依存関係を取得しますが、型定義にはnpmを使用します(DefinitelyTypedリポジトリを使用)。

私はここ数日、moment型定義をインポートしようとして苦労しています。 jspmを使用してmomentをインストールしましたが、独自の型定義が付属していることがわかりました。そのため、コマンドnpm install @types/moment --save-devを呼び出すと、スタブと非推奨の警告のみが表示されます。

これはMomentのスタブタイプの定義です( https://github.com/moment/moment )。 Momentは独自の型定義を提供するため、@ types/momentをインストールする必要はありません。

さて、それが私のエディター、プロジェクト、TypeScriptの設定なのか、それとも本当にTypeScriptの問題なのかはわかりませんが、momentの型定義を正しくインポートできないようです。

import moment from 'moment';またはimport * as moment from 'moment';のいずれかを実行すると、エディターでこのエラーが発生します(atom-TypeScriptを使用したアトムですが、Visual Studio Codeでも同じエラーが発生します)Cannot find module 'moment'.

このエラーにもかかわらず、アプリケーションをビルドすると正常に機能します(モーメント関数の呼び出しは機能します)。

私はインターネットで見つけた多くの解決策を試しましたが(明らかに、タイプ定義をすぐにインポートすることは一般的な問題です)、どれもうまくいきませんでした。昨日、node_modules/@types内にディレクトリmomentを手動で作成し、その中にmoment.d.tsを配置することで、なんとか機能させることができました(ただし、名前をindex.d.tsに変更する必要がありました)。

このソリューションがあまり好きではなかったので、少なくともnode_modules構造を変更せずにデータを入れることができるtypesフォルダーを作成したかったのです。そこで、custom-typesフォルダーを作成し、そこにタイプ定義を含むmomentフォルダーを配置し、custom-typestsconfig.jsonに追加しました。これでうまくいくと思いましたが、実際にはエラーが再発しました...

今、私はアイデアがなく、他に何を試すべきか本当にわかりません。

これは私の現在のtsconfig.jsonです(最後の試みで、custom-typesフォルダーとnode_modulesフォルダーと同じレベルにありますが、異なるパスでtsconfig.jsonフォルダーを追加しました] _ファイル)

{
    "compilerOptions": {
        "sourceMap": true,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "removeComments": false,
        "noImplicitAny": false,
        "module": "system",
        "target": "es5",
        "moduleResolution": "classic",
        "typeRoots": [
            "node_modules/@types/",
            "./custom-types/",
            "custom-types/",
            "../custom-types/",
            "../../custom-types/",
            "../../../custom-types/"
        ],
        "types": [
            "angular-ui-router",
            "angular",
            "angular-mocks",
            "jquery",
            "jasmine",
            "moment",
            "es6-shim"
        ]
    },
    "compileOnSave": false,
    "filesGlob": [
        "custom-types/**/*.ts",
        "src/**/*.ts",
        "src/**/*.tsx",
        "!jspm_packages/**",
        "!node_modules/**"
    ]
}
10
valepu

TypeScript(IntelliJ)でmomentを使用しており、タイピングをインストールするための追加の作業はありません。

関連する構成は次のとおりです。

  • 内部tsconfig.json
    • "moduleResolution": "Node"
    • "types"セクションはまったくありません
  • ./package.jsonには@types/momentがありません
  • 内部./node_modules/moment/
    • ./moment.d.tsが存在します
    • ./package.jsonには"typings": "./moment.d.ts"があります
    • ./package.json"version": "2.14.1"です

"moduleResolution": "Classic"に戻すと、TypeScriptはcannot find module 'moment'と表示します。おそらくそれが原因です。

8
Robert Penner