20220121 TIL


esModuleInterop
commonJSモジュールをesmでインポートする場合は、コンパイル結果に__importStarおよび__importDefaultを追加することを選択できます.
import moment from 'moment';
moment();
momentではcommonJSモジュールとしてエクスポートされるため、前述したようにアンダースコアにエラーが提示される.
node_modules/moment/ts3.1-typings/moment.d.ts:784:1
export = moment;
This module is declared with using 'export =', and can only be used with a default import when using the 'esModuleInterop' flag.
(このモジュールは「export=」を使用して宣言されており、デフォルトのインポートとともに使用できるのは、「esModuleInterop」タグを使用する場合のみです.)
この問題を解決するために、以下のように修正することができる.
import * as moment from 'moment';
moment();
しかし問題は,esmの規格から見ると*を用いたimportの結果はobjectにしか達しないため,これが正しい方式とは考えられないことである.
したがって、tsconfigに"esModuleInterop": trueを追加することによって解決することができる.
// 컴파일 전
import moment from 'moment';

// 컴파일 후
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const moment_1 = __importDefault(require("moment"));