我正在使用一个项目SweetAlert2库将我的一个项目迁移到TypeScript。
导入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.ts
复制到sweetalert2/dist/sweetalert2.d.ts
,但是又遇到另一个错误:
File 'node_modules/sweetalert2/dist/sweetalert2.d.ts' is not a module.
ts(2306)
这里发生了什么,为什么TS抱怨dist/sweetalert2.d.ts
不是一个模块?
答案 0 :(得分:3)
SweetAlert的当前类型定义不提供“子模块”的类型。
使用declare module
语法like this时,您一次输入了整个程序包(从^sweetalert2$
导入时用户会得到什么),但您并未描述单个程序包中的内容完全是dist /中的已编译文件,因此,不能明确地将它们作为目标。
尝试完全删除您的已复制文件中的declare module
块。然后,使用declare namespace Swal
,它将起作用。
我们应该能够修改sweetalert2的声明文件,以便简单导入和子文件导入都能正常工作。
看看我如何键入graphql-compose,这样就可以实现:graphql-compose
每个.js文件都有一个.d.ts副本,并且不再有一个文件用declare module
描述整个模块。
编辑:我在您repro上尝试了这种方法,效果很好,而且我们也可以输入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';
}
答案 1 :(得分:2)
我遇到了同样的问题,但我从您的链接 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。
检查此步骤
<块引用>项目 -> 架构师 -> 测试 -> 选项 -> 样式:[] 和脚本:[]