web-dev-qa-db-ja.com

TypeScriptでMomentJSを使用する-moment()にはどのタイプがありますか?

現在、プロジェクトをES5からES6に変換していますが、MomentJS(_version 2.18.1_)の問題に直面しています。問題は、Momentオブジェクトである変数がいくつかあることですが、それらに対してmoment()を呼び出すことはできません。

例:

_    import * as moment from "moment";
    export class DateThingy{

        constructor(private moment) { //What type does this have??
        }

        public getDate(): moment.Moment { 
           return this.moment();
        }
    }
_

1)_private moment_のタイプを_private moment: moment_に設定した場合、WebStormから「名前 'moment'が見つかりません。

2)タイプを_private moment: moment.Moment_に設定すると、オブジェクトが変更され、this.moment()を呼び出せなくなります(オブジェクトになり、関数呼び出しはありません)。 Webstormから「タイプが呼び出し署名を持たない式を呼び出すことはできません。タイプ「Moment」には、呼び出し可能な署名がありません。

3)MomentStaticはエクスポートされないため、もう使用できません。 _private moment: moment.MomentStatic_と入力すると、WebStormから次のように表示されます: "namespace 'moment'にはエクスポートされたメンバー 'MomentStatic')がありません

それでは、この例ではどのタイピングを使用すべきでしょうか?

21
Mr.wiseguy

Mike McCaughan が述べたように、モーメントオブジェクトはコンストラクターに注入できません。どういうわけか、これは古いバージョンのMomentJSで可能でした。これは、コンストラクタープロパティを削除し、_import * as moment from "moment"_を介して含まれているグローバルモーメントオブジェクトにアクセスすることで解決できます。

関数moment()Momentオブジェクトを返します。これは_moment.Moment_で入力できます。

したがって、コードは次のように書き換えることができます。

_import * as moment from "moment";

export class DateThingy{

     constructor() {
     }

     public getDate(): moment.Moment { 
        return moment();
     }
}
_
45
Mr.wiseguy

エイリアスなしで瞬間をインポートしようとしましたか?

_import moment from 'moment';_

これは私のために働いた。また、TypeScriptコンパイラはそれについて文句を言いません。

const date = moment().format('YYYYMMDD');

これにはtsconfigの更新が必要です!

TSConfigでは、オプション allowSyntheticDefaultImports を追加して、デフォルトのエクスポートがないライブラリのデフォルトのインポートを許可する必要があります。

例(tsconfig.json):

_{
  "compileOnSave": false,
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
  }
}
_
14
OHM