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

TypeScript定义别名访问嵌套模块类出现运行报错如何解决

问题原因

你使用的import Models = App.Shared.Models;是TypeScript原生支持的命名空间别名语法,本身写法没有问题。运行时抛出Cannot read properties of undefined (reading 'Models')错误的核心原因是脚本加载顺序错误:执行别名所在的代码时,定义App.Shared.Models命名空间的Models.ts编译产物还没被加载,运行时根本不存在App.Shared这个全局对象,自然无法读取其下的Models属性。

解决方案

你可以根据自己的项目规范二选一:

方案1:保留全局命名空间写法

如果你项目里统一用TS的全局namespace(也就是你写的module App.Shared.Models这种内部模块)写法,不需要改TS语法,只需要修复加载顺序问题:

  • 如果你是手动在HTML中引入JS脚本,必须保证Models.ts编译出的JS文件,排在所有引用它的业务JS文件之前加载:
<!-- 先加载定义命名空间的文件 -->
<script src="/path/Models.js"></script>
<!-- 再加载写别名、实例化类的业务文件 -->
<script src="/path/your-business.js"></script>
  • 如果你用TS自带的编译合并能力,需要在tsconfig.json中开启outFile配置,指定合并后的输出文件路径,TS会自动按照命名空间的依赖顺序合并代码,从根源上避免加载顺序问题。注意:这个配置仅在module设置为system/amd/none时生效。
  • 额外提醒:实例化类时建议补上括号写成new Models.UserModel(),不要省略(),避免在老旧JS运行环境下出现解析异常。

方案2:改用现代ES模块写法(官方推荐)

目前TypeScript官方已经不推荐在业务代码中使用全局命名空间写法,更建议用标准ES模块组织代码,彻底避免全局对象污染、加载顺序混乱的问题:

  1. 重写Models.ts,去掉全局module包裹,直接导出类:
// Models.ts
export class UserModel
{
    public Id: number;
    public Name: string;
    public Email: string;
}
  1. 在需要使用类的文件中,通过相对路径导入模块并设置别名即可,模块打包工具/运行时会自动处理依赖加载顺序:
// 路径按你实际的文件目录调整
import * as Models from './Models';
let user = new Models.UserModel();

内容的提问来源于stack exchange,提问作者Felipe Costa Gualberto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 21:27:18