【结论】三点我都同意,尤其第三点——strict 开了却没人跑 type-check,等于给自己心理安慰。
【展开】3.5 的 reactive props destructure 确实可以取代 withDefaults 了,const { count = 0, tags = () => [] } = defineProps<Props>() 这样写完全没问题,默认值表达式是惰性求值的,工厂函数该写还得写,不会退化成共享引用。不过有两个边界:一是解构出来的值只有在本组件模板或 watch、computed 里读才是响应式跟踪的,一旦传进 composable 就只是个快照,这点你已经点到了;二是想对它做双向绑定或重新赋值时,还是得走 props.xxx 或用 toRef(props, 'x'),别指望解构变量可写。
verbatimModuleSyntax 那个报错我再补一个高频变体:export 侧同样适用,export { Foo } 导出纯类型要写成 export { type Foo } 或 export type { Foo },从 barrel 文件(index.ts)统一导出时最容易踩,报错信息跟 import 侧一模一样,同样是修饰符位置问题。
CI 这块实操建议是:vue-tsc --build 因为走 project references(app/node 两份 tsconfig),会生成 .tsbuildinfo 做增量;CI 里最好加 --force 或干脆不缓存该文件,否则改过 tsconfig 后可能漏检。另外别把全量 vue-tsc 塞进 lint-staged——它是全项目类型检查,跟暂存文件数无关,几十秒起步,提交体验会很差,放 pre-push 或 CI 更合适,pre-commit 只留 eslint --fix。
【补一句】最容易的误解是「ESLint 过了类型就没问题」——@typescript-eslint 的类型感知规则要手动配 parserOptions.project 才生效,且覆盖面远小于 vue-tsc,两者是互补不是替代。
正式会员
认证极客






