如果我尝试导入不存在的默认导出,为什么 TypeScript 不报错?

Why doesn't TypeScript complain if I try to import a non-existent default export?

我有一些代码要从非 TypeScript CommonJS 文件转换为 TypeScript ES6 模块,我 运行 遇到一些需要使用 import * as x 而不是 [= 导入的问题14=]:

原来的代码是这样的:

const luxon = require('luxon');

console.log(luxon.DateTime.now().toString());

然后我错误地改成了:

import luxon from 'luxon';

console.log(luxon.DateTime.now().toString());

... 导致错误:

Cannot read property 'DateTime' of undefined

问题是luxon没有默认导出,import luxon from 'luxon'变成了const luxon = require('luxon').default;这样的代码。

所以正确的导入是:

import * as luxon from 'luxon'; // or even better, import { DateTime } from 'luxon'

我的问题是,为什么 TypeScript 不抱怨我使用的是不存在的默认导出,我能做些什么让它为我检测到这个吗?

我发现如果我尝试使用来自 TypeScript 模块而不是来自 JavaScript 的不存在的默认导出(即使我已经为它安装了类型)。

似乎 luxon npm 包不包含类型,因此您还需要安装 @types/luxon 作为开发依赖项。

如果您已经安装了 types 并且 typescript 没有抱怨它没有默认导出的导入,这意味着您在 tsconfig 中启用了 allowSyntheticDefaultImportsesModuleInterop 这不起作用对于 es 模块。

这是打字稿尝试导入它的方式:

但 luxon 确实将 __esModule 设置为 true

根据您的其他依赖项,我会禁用 allowSyntheticDefaultImportsesModuleInterop 并且 typescript 将生成正确的错误:

error TS1192: Module '".../@types/luxon/index"' has no default export.