将SweetAlert2与TypeScript一起使用,找不到模块'sweetalert2 / dist / sweetalert2.js'的声明文件

时间:2019-08-02 07:07:18

标签: javascript typescript typescript-typings sweetalert2 javascript-import

我正在使用一个项目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不是一个模块?

2 个答案:

答案 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。

检查此步骤

<块引用>

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