必须手动确认 Use TypeScript? 为 Yes,否则生成非完整TS项目;需检查 tsconfig.json 和 src/main.ts 是否存在,并在 compilerOptions.types 中添加 "@dcloudio/types"。

直接用 npm create uni-app@latest 创建项目时,必须手动确认 Use TypeScript? 为 Yes,否则生成的是 main.js 和空的 TS 支持——这不是你手速慢,是 CLI 最后一步默认高亮 No,回车就跳过。
创建时必须按方向键选 Yes 并回车
很多人以为选了 “TypeScript” 模板就完事了,其实 create uni-app@latest 的交互分两步:先选模板,再单独确认是否启用 TS。终端里看到 Use TypeScript? » No 时,得用方向键切换到 Yes 再回车。
- 创建完立刻检查根目录:必须同时存在
tsconfig.json和src/main.ts;缺任何一个,说明失败,删掉重来 - 别试图在 JS 项目里后期加 TS——
@dcloudio/types类型声明、defineApp/definePage泛型适配、pages.json类型导入等一整套链路会断裂 - 禁用旧版全局安装的
@vue/cli-plugin-uni或第三方脚手架,它们不认官方 TS 编译逻辑
tsconfig.json 必须显式引入 @dcloudio/types
即使生成了 tsconfig.json,默认配置也不含 uni 全局 API 类型,uni.showToast、getCurrentPages() 会报 Cannot find name 'uni' 或推导为 any。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
- 在
compilerOptions.types中加入"@dcloudio/types"(HBuilderX 官方维护)和可选的"@uni-helper/uni-app-types"(补全方法签名) -
include至少覆盖"src/**/*"和"types/**/*"(如有自定义声明文件) - 避免设
target: "es5"——uni-app 编译器实际依赖 es6+ 语法,设低了反而触发兼容性降级错误
Vue 文件里 lang="ts" 不等于类型安全
<script lang="ts"></script> 只是告诉编译器走 TS 流程,但 Vue 3 + Composition API 下,类型推导失效很常见。
- 页面组件(如
pages/index/index.vue)必须用definePage()包裹,不能用defineComponent();且推荐显式泛型,例如definePage() -
App.vue必须用defineApp,setup 返回值需与data类型一致,否则this.$scope等属性无类型提示 -
getCurrentPages()返回值默认是any[],必须手动断言:getCurrentPages() as Page.PageInstance[](H5)或按平台选WechatMiniprogram.Page.Instance等
pages.json 导入时没有类型提示?要自己声明
虽然 pages.json 是 JSON 文件,但你在 TS 里 import pages from '@/pages.json' 时,TS 默认不识别它的结构,报 Cannot find module 或推导为 any。
- 在
src/types/global.d.ts中添加:declare module '@/pages.json' { const value: PagesJson; export default value; } - 再定义
interface PagesJson,字段按实际需要写(如path: string、style: Record<string any></string>),别直接用any - 不同平台对
subNVue、usingComponents等字段支持不一,硬编码比放任any更可控
最常被忽略的一点:跨平台项目里 getCurrentPages() 的返回类型不是统一的,H5、小程序、App 端各自有独立类型定义,封装时得加类型守卫,而不是写一次断言到处复用。

















