You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何在TypeScript类中正确使用dojo/text!

在TypeScript 2.7.2的Dojo项目中使用dojo/text!的解决方案

我完全理解你在将基于dijit._Widget和dijit._TemplatedMixin的Dojo项目迁移到TypeScript 2.7.2时,遇到的dojo/text!模板加载问题——这种混合了旧版Dojo AMD生态和TS类型系统的场景,确实容易出现适配问题。结合你的场景,我整理了几个经过验证的解决步骤:

1. 补全dojo/text!的类型声明

TypeScript无法自动识别Dojo的插件模块,所以需要在你的.d.ts类型定义文件中添加dojo/text!的模块声明:

// 在你的自定义dojo类型文件中添加
declare module 'dojo/text!*' {
    // 模板内容导出为字符串
    const templateContent: string;
    export default templateContent;
}

这个声明告诉TS:所有以dojo/text!开头的模块,都会导出一个字符串类型的模板内容,这样导入时就不会出现类型错误。

2. 调整TS配置适配Dojo AMD

确保你的tsconfig.json配置符合Dojo的AMD模块规范:

{
    "compilerOptions": {
        "module": "amd",
        "moduleResolution": "classic", // TypeScript 2.7.2中classic更兼容Dojo的AMD解析
        "allowSyntheticDefaultImports": true, // 支持默认导入模板内容
        "target": "es5", // 适配Dojo的运行环境
        "declaration": false, // 如果不需要生成d.ts可以关闭
        "outDir": "./dist" // 根据你的项目目录调整
    }
}

3. 在TS类中正确加载并使用模板

结合你已经定义的继承dijit._Widget和dijit._TemplatedMixin的接口,有两种常用的实现方式:

方式一:直接赋值给templateString(推荐)

在TS类中导入模板,然后赋值给_TemplatedMixin要求的templateString属性:

// 导入必要的Dojo模块和模板
import 'dijit/_Widget';
import 'dijit/_TemplatedMixin';
import template from 'dojo/text!./templates/MyWidget.html';

// 假设你已经定义了MyWidgetInterface接口
class MyWidget implements MyWidgetInterface {
    // 声明templateString属性,类型为字符串
    templateString: string = template;

    constructor(params: any, srcNodeRef?: Element) {
        // 调用dijit._Widget的构造函数
        (this as any).constructor.superclass.constructor.call(this, params, srcNodeRef);
    }

    // 实现接口中的其他方法,比如postCreate()
    postCreate(): void {
        // 模板渲染完成后的逻辑
        console.log('Widget rendered with template');
    }
}

方式二:结合Dojo的declare语法(兼容旧代码)

如果你的项目中还有大量JS类使用Dojo的declare语法,也可以在TS中混合使用:

import template from 'dojo/text!./templates/MyWidget.html';

// 用Dojo declare创建类,同时兼容TS类型
const MyWidget = dijit.declare([dijit._Widget, dijit._TemplatedMixin], {
    templateString: template,

    postCreate(): void {
        // 业务逻辑
    }
}) as typeof MyWidgetInterface;

// 导出供其他TS模块使用
export default MyWidget;

4. 常见问题排查

  • 路径错误:确保模板路径是相对于当前TS文件的正确路径,Dojo的loader会按照AMD规则解析路径,比如./templates/MyWidget.html是相对于当前文件的模板目录。
  • Mixin类型报错:如果TS提示_TemplatedMixin的属性不存在,检查你的.d.ts接口是否正确继承了dijit._TemplatedMixin,并声明了templateString属性:
    interface MyWidgetInterface extends dijit._Widget, dijit._TemplatedMixin {
        templateString: string;
        // 其他属性和方法
    }
    
  • 编译后依赖缺失:检查TS编译后的JS文件,确认dojo/text!的依赖被正确注入到AMD的define数组中,如果没有,检查tsconfig.json的module和moduleResolution配置是否正确。

内容的提问来源于stack exchange,提问作者rdiddly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:50:47