如果我尝试导入不存在的默认导出,为什么 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 中启用了 allowSyntheticDefaultImports
和 esModuleInterop
这不起作用对于 es 模块。
这是打字稿尝试导入它的方式:
但 luxon 确实将 __esModule
设置为 true
。
根据您的其他依赖项,我会禁用 allowSyntheticDefaultImports
和 esModuleInterop
并且 typescript 将生成正确的错误:
error TS1192: Module '".../@types/luxon/index"' has no 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 中启用了 allowSyntheticDefaultImports
和 esModuleInterop
这不起作用对于 es 模块。
这是打字稿尝试导入它的方式:
但 luxon 确实将 __esModule
设置为 true
。
根据您的其他依赖项,我会禁用 allowSyntheticDefaultImports
和 esModuleInterop
并且 typescript 将生成正确的错误:
error TS1192: Module '".../@types/luxon/index"' has no default export.