uni-app cli 创建 ts 项目需手动确认“yes”启用typescript,检查tsconfig.json和main.ts;app.vue须用defineapp/definepage泛型,pages.json需全局声明类型;getcurrentpages()须类型断言;必须安装并配置@dcloudio/types以支持uni全局api类型。

uni-app CLI 创建 TS 项目时选错模板会直接生成 JS 项目
uni-app 官方 CLI(npm create uni-app@latest)默认不强制启用 TypeScript,即使你选了“TypeScript”选项,也可能因模板版本或交互逻辑问题,最终生成的是 main.js 而非 main.ts。
实操建议:
- 执行
npm create uni-app@latest后,**必须手动确认最后一步是否显示Use TypeScript? » Yes并回车确认**,不能跳过或按默认回车(有些终端会默认选 No) - 创建完成后立即检查根目录下是否存在
tsconfig.json和src/main.ts;若只有main.js,说明失败,需删掉重来 - 避免使用旧版全局安装的
@vue/cli-plugin-uni或第三方脚手架,它们对 TS 支持不稳定,只认官方create uni-app
TS 项目里 App.vue 和 pages.json 的类型声明容易漏配
uni-app 的 App.vue 是入口组件,但默认模板不会自动加 defineComponent 和类型标注;pages.json 虽是 JSON 文件,但实际被 uni-app 编译器读取为 JS 对象,TS 不校验它——但你在 JS/TS 里 import 它时,没类型提示会埋坑。
实操建议:
-
App.vue的<script setup lang="ts"></script>区域,务必用definePage(H5/小程序平台)或defineApp(App 端)配合泛型,例如:defineApp<appoptions>({})</appoptions>,否则生命周期参数无类型 - 在
src/types/global.d.ts中手动声明declare module '@/pages.json',再给它导出一个 interface,否则import pages from '@/pages.json'会报Cannot find module - 别依赖 IDE 自动推导
pages.json结构,它的字段(如subNVue、usingComponents)有平台差异,硬编码类型比 any 更安全
uni-app 的 getCurrentPages() 返回值在 TS 下默认是 any[]
这个函数在 JS 里很常用,但在 TS 项目中,如果不显式标注,返回的页面实例数组没有任何类型信息,调用 page.$vm?.dataRef 或自定义属性时会报错或失去智能提示。
实操建议:
- 不要直接写
const pages = getCurrentPages(),而要写成:const pages = getCurrentPages() as Page.PageInstance[] - 注意:不同平台返回的页面类型不同——H5 是
Page.PageInstance,微信小程序是WechatMiniprogram.Page.Instance,App 端是UniApp.Page;跨平台项目建议封装一层类型守卫函数 - 如果用了
uni.navigateTo传参,记得在目标页面的onLoad里用options参数接收,它的类型是Record<string string></string>,不是any,别漏了类型断言
TS 编译报错 Cannot find name 'uni' 或 Property 'reLaunch' does not exist on type 'typeof uni'
这是最常卡住人的错误。uni-app 的全局 API(uni.navigateTo、uni.getSystemInfoSync 等)类型定义不在 types 目录下,也不随 uni-app npm 包自动注入,需要手动配置。
实操建议:
- 确保
tsconfig.json的compilerOptions.types包含"@dcloudio/types"(不是uni-app或miniprogram-api-typings) - 检查是否安装了
@dcloudio/types:运行npm install -D @dcloudio/types,且版本要与uni-appCLI 版本对齐(v3.99+ 对应@dcloudio/types@3.99.x) - 如果用了 HBuilderX,它自带类型库,但 CLI 项目必须靠
@dcloudio/types,别指望编辑器自动补全能代替配置
pages.json 这类非标准模块的处理,都得手动兜底。漏一个 as 或少一行 types 配置,就可能让整个项目的类型检查形同虚设。










