Angular 5+TypeScript环境下如何导入带多插件的svg.js?
解决Angular 5 + TypeScript中导入svg.js及多插件的问题
我来帮你搞定这个导入svg.js插件的问题,核心是要理解svg.js插件的工作机制——它们是通过扩展原SVG类的原型来添加功能的,同时要确保TypeScript能识别到这些扩展的类型定义。下面是具体的解决方案:
1. 确认依赖与类型包已正确安装
你已经安装了基础包和类型定义,但再确认一下版本匹配(因为Angular 5对应的TypeScript版本较旧,要对应svg.js 2.x系列的类型):
npm install svg.js@2.x svg.draggable.js@2.x --save npm install @types/svg.js@2.3.1 @types/svgjs.draggable@0.0.30 --save-dev
2. 正确的导入方式(关键)
svg.js的插件不需要单独赋值给变量,只要在导入基础svg.js之后,作为副作用导入插件即可,插件会自动扩展原SVG元素的原型方法,同时TypeScript的类型定义会让编译器识别这些新增方法:
// 先导入基础svg.js核心库 import * as Svg from 'svg.js'; // 导入draggable插件,无需赋值,它会自动扩展Svg的原型 import 'svg.draggable.js'; // 其他插件同理,比如svg.whatever.js import 'svg.whatever.js';
3. 确保TypeScript类型定义生效
如果还是出现类型错误,检查你的tsconfig.json文件,确保编译器能读取到对应的类型定义:
{ "compilerOptions": { // 其他配置... "types": [ "svg.js", "svgjs.draggable" // 加入其他插件的类型包名称 ] } }
如果你的tsconfig.json中没有types数组,默认会自动加载node_modules/@types下的所有类型,这一步可以省略,但遇到类型识别问题时可以手动添加。
4. 修改后的组件代码示例
现在你可以在组件中正常调用插件方法了,不会再出现TS2339错误:
import * as Svg from 'svg.js'; import 'svg.draggable.js'; export class TicketComponent implements OnInit { ngOnInit() { let draw = Svg('ticket-svg').size(1000, 500); let rect = draw.rect(800, 300).attr({fill: '#fff', stroke: '#000', 'stroke-width': 1}); // 现在可以正常调用draggable方法 rect.draggable(); } }
为什么之前的尝试无效?
- 你想的
import * as Svg from {'svg.js', 'svg.draggable.js'}这种语法并不存在于ES模块规范中,插件不是独立的导出模块,而是通过副作用扩展核心库的原型。 - 合并JS文件的临时方案无法解决TypeScript的类型识别问题,因为编译器需要对应的
.d.ts类型定义文件来确认新增方法的存在,单纯合并JS代码不会更新类型信息。
内容的提问来源于stack exchange,提问作者balazs630
相关产品推荐
相关产品推荐

