6

我正在将我的一个项目迁移到 TypeScript,在该项目中使用了SweetAlert2库。

导入 SweetAlert2(JS 和 CSS)的默认方式是

import Swal from 'sweetalert2'

这适用于 TypeScript,因为库中有类型:https ://github.com/sweetalert2/sweetalert2/blob/master/sweetalert2.d.ts

但在我的项目中,导入方式是这样的:

import Swal from 'sweetalert2/dist/sweetalert2.js'

这仅适用于 JS,没有样式。使用这种类型的导入,我收到 TS 错误:

Could not find a declaration file for module 'sweetalert2/dist/sweetalert2.js'. 

ts(7016)

我试图复制sweetalert2/sweetalert2.d.tssweetalert2/dist/sweetalert2.d.ts,但又遇到了另一个错误:

File 'node_modules/sweetalert2/dist/sweetalert2.d.ts' is not a module. 

ts(2306)

这里发生了什么以及为什么 TS 抱怨dist/sweetalert2.d.ts不是一个模块?

4

2 回答 2

4

SweetAlert 的当前类型定义不提供“子模块”的类型。当您使用这样的语法declare module时,您“一次”键入整个包(用户从 导入时得到什么),但您没有准确描述 dist/ 中各个编译文件中的内容,所以是的,他们可以不能明确定位。^sweetalert2$

尝试完全删除复制文件declare module中的块。然后,使用,它会工作。declare namespace Swal

我们应该能够修改 sweetalert2 的声明文件,这样简单的导入和子文件的导入都可以工作。

看看我是如何输入 graphql-compose 的,这样就可以了:graphql-compose

每个 .js 文件都有一个 .d.ts 对应文件,不再有一个文件用 .d.ts 来描述整个模块declare module

编辑:我在您的复制中尝试了这种方法,效果很好,我们也可以打字sweetalert2.all.js。以下解决方案可能更简单(文件更少,构建脚本更简单)。1:1 映射方法更好,但可能更适合大型库。

另一种可能性是向declare module 'sweetalert2/dist/{**}'单个文件添加条目,该文件重新sweetalert2.d.ts导出每个dist/变体的默认模块内容:

declare module 'sweetalert2' {
    // Current contents of the file, unchanged
}

declare module 'sweetalert2/dist/sweetalert2.js' {
    export * from 'sweetalert2';
    // "export *" does not matches the default export, so do it explicitly.
    export { default } from 'sweetalert2';
}

declare module 'sweetalert2/dist/sweetalert2.all.js' {
    export * from 'sweetalert2';
    export { default } from 'sweetalert2';
}
于 2019-08-02T09:20:50.760 回答
3

我遇到了同样的问题,但我从你的链接sweetalert2得到了我的解决方案。

按照使用部分。

i was using in import SWAl from "sweetalert2/dist/sweetalert2.js".

那在新项目中有效,但在我的旧项目中无效。所以我搬到这里并得到了我的解决方案。刚刚被sweetalert2/dist/sweetalert2.js 替换sweetalert2

import Swal from 'sweetalert2';

每个人也需要专注于这条线。我从sweetalert2 的angular.json文件中删除了 css 和 js。

检查此步骤

项目 -> 架构师 -> 测试 -> 选项 -> 样式:[] 和脚本:[]

于 2021-01-05T11:34:54.807 回答