
[code]

    import * as dt from 'date-utils'
    
[/code]

単に上記のような形でimportを行った時に発生します。

エラーの内容から、tsconfig.jsonに問題があるように思えないのですが、何が原因なのでしょうか？

[code]

    Error:(1, 21) TS2497: This module can only be referenced with ECMAScript imports/exports by turning on the ‘esModuleInterop’ flag and referencing its default export.
    
[/code]

以下tsconfig.jsonの内容

[code]

    {
      "compilerOptions": {
        "moduleResolution": "node",
        "skipLibCheck": false,
        "target": "es5",
        "module": "commonjs",
        "lib": ["es2017", "dom"],
        "experimentalDecorators": true,
        "allowJs": false,
        "jsx": "react",
        "sourceMap": true,
        "strict": true,
        "noImplicitReturns": true,
        "noUnusedLocals": true,
        "noUnusedParameters": true,
        "noFallthroughCasesInSwitch": true,
        "esModuleInterop": true,
        "removeComments": true,
        "newLine": "LF",
        "downlevelIteration": true,
        "resolveJsonModule": true,
        "allowSyntheticDefaultImports": false
      },
      "exclude": ["node_modules"]
    }
    
[/code]


CC BY-SA 4.0
2019-09-27T12:35:58.837
59326
2019-10-03T15:08:57.297
2019-09-27T13:05:40.747
3060
35997
question
node.js typescript
typescriptでdate-utilsモジュールのimportができない


このエラーメッセージは、`default export`をインポートする構文を用いて`date-
utils`をインポートしなければならないと指摘しています。つまり、次のようにすればエラーが消えると思われます。

[code]

    import dt from 'date-utils'
    
[/code]

## 追記

上記に加えて、さらに`tsconfig.json`から`"allowSyntheticDefaultImports":
false`の設定を削除しないとエラーが消えませんでした。

`esModuleInterop`とこの`allowSyntheticDefaultImports`はどちらもcommonjsモジュールをESModuleとして扱う場合に関係するオプションで、前者がランタイムのサポート、後者が型システム上のみのサポートという違いがあります。

`esModuleInterop`をオンにした場合は自動的に`allowSyntheticDefaultImports`もオンになりますが、今回の設定では明示的に`allowSyntheticDefaultImports`をオフにしていたために型システム上のエラーが発生したようです。

commonjsモジュールを読み込むという目的に沿うならば`allowSyntheticDefaultImports`をオフにする理由はありませんので、これをオンにすれば解決となります。

> request-promiseモジュールも同じように型定義ファイル上にdefault exportがなく、export文が複数あるわけではないのに、
> import * from 'request-promise'で問題なく使用できている点とどこに差があるのかわからないというところです。

これについては、どちらのモジュールも`export =`でオブジェクトをエクスポートしている点は変わらないののの、`date-
utils`は関数をエクスポートしているのに対して`request-promise`はただのオブジェクトをエクスポートしているという違いが影響しています。  
ESモジュールの`import * as dt from 'date-
utils'`という構文では`dt`が関数などではないただのオブジェクト（正確にはmodule namespace exotic
object）になるため、`date-utils`がエクスポートするものと不整合がありエラーが発生しています。  
対して`request-promise`を`import * as rp from 'request-
promise'`のように読み込んだ場合、`rp`をモジュールからエクスポートされている（ただの）オブジェクトとすれば型システム上の不整合はないためラーが発生しません。


CC BY-SA 4.0
2019-09-27T13:31:02.260
59327
2019-10-03T15:08:57.297
2019-10-03T15:08:57.297
30079
30079
59326
answer