近日,有开发者在知乎上提出了一个问题:“TypeScript 不适合在 vue 业务开发中使用吗?”,Vue的作者尤雨溪针对这一问题发表了自己的看法,也解释了Vue 3.0选用TypeScript的原因,全文如下。

注:本文已获得尤雨溪本人授权转载。

必须要承认的是,2.x 的 TS 支持显然跟 React 和 Angular 是有差距的,这也是为什么 3.0 要加强这一块。

关于目前 2.x 跟 TS 的整合,通常需要基于 vue-class-component 来用基于 class 的组件书写方式。虽然对于默认的对象书写方式有类型推导支持,但里面的实现绕了很多弯。问题的本质其实很简单:因为当初 API 的设计根本就没有考虑类型系统。

Vue 五年半以前刚开始写的时候,JS 根本没有类型系统,我自己当时也不用带类型的语言,所以 Vue 的组件本质上就是一个 “包含了描述组件选项的对象”。

这个设计算是一个典型的 intuition based design,它不是从语言本身的机制或是类型系统出发去设计的,而是单纯从人如何描述自己想要的东西出发的。这样的设计的好处是对于新手很容易理解,缺陷是跟类型系统之间确实存在一定的 “断层”。这个断层的意义到底有多大,对于不同类型的用户其实不太一样。首先,因为 API 还算简单直白,所以即使和传统的 OO 有一定的 mismatch,但大部分人适应起来还是很快。对于不使用类型系统,更关注组件业务逻辑的用户来说,这个断层其实是感受不到的。

其次,这里的断层其实是双向的:你可以说是 Vue 的 API 设计不 type friendly,反过来也可以说是 TS 的类型系统不够强大所以没法给 Vue 提供足够好的支持。一个例子就是 JSX 其实一开始也没有类型支持,完全是 TS 强行给加了一整套针对 JSX 的推导机制才给了 TSX 现在的开发体验。如果 TS 因为 JSX 不属于真正的 JS 规范因而不提供支持,是不是也可以说 React 的设计跟类型系统存在断层?

当然想要抹平这个断层,更直接的办法是对 API 进行重新设计。这话说起来很简单,但对于 Vue 来说,改 API 需要考虑很多东西:

  • 跟原有 API 的兼容性:能否同时支持新旧 API?旧的用户如何升级?像 Angular 那样直接改得面目全非当然比较简单,但说直接点就是不管旧版本用户的死活;

  • 如何设计出既能提供良好的类型推导,又不让为了类型而做的设计 leak 到非 TS 用户的使用体验中去?如何在 TS 和非 TS 的使用体验之间做到最好的一致性和平衡?Again,像 Angular 那样不管非 TS 的用户的死活当然也是比较简单,但我们不会这么做。

  • class 的原生支持不理想:如果太早用 class 作为默认的 API,那么意味着用户不预编译就无法在一部分浏览器中使用,这是我们一直极力避免的情况。Vue 一直很重视 “引入一个 script 就可以开始写” 这样的用例,因为这保证了新人上手的最低门槛,也让 Vue 可以很简单的整合到 legacy 应用当中作为 jQuery 的替代品。所以要改 API 有一个时机问题,太早了不合适。

  • 用 class 写组件所依赖的 class fields, decorators 等提案尚不稳定:基于 stage\u0026lt;4 的提案设计 API 是非常具有风险的,比如大家一开始都默认 class fields 的语义是 [[Set]],结果到 stage 3 改成了 [[Define]],这下 Polymer 急死了,因为它们有一个 API 设计是完全依赖了 class fields 的 [[Set]] 语义的。decorators 提案被彻底重新设计,并且在最近的 TC39 试图升 stage 3 被 V8 团队出于性能的考虑否决,可能又要大改;decorators 是否能放在 export 前面依然还在争论,为此 Angular 的老大 Igor 急的不行… 所以,如何避免设计出来的 API 在提案发生改动之后被迫也要改,陷自己于尴尬境地?Again,时机问题,等提案成熟,或是等有争议的点有结论后再动手(虽说我其实也是被邀请参与了这些东西的讨论的,但讨论规范真的是超级费时费神,还往往说服不了几个人…)。

额外说说模版和类型推导的关系。表面上看,隔了一层模版语法 + 编译,似乎确实存在 “断层”,但其实里面没你想的差那么远。Vue 的模版是编译成 virtual dom 渲染函数的,生成的 js 跟 React 的渲染函数一样可以类型推导,而模版跟生成的 js 之间是完整的逻辑映射,所以这里其实主要是需要做一些工具链上的衔接,把对生成的 js 分析出来的 intellisense 反馈到 IDE 里的模版上,技术上是完全可行的。

高票答案有另一个地方说 React 的 js 本位使得它做多端渲染简单,这话其实不对,做多端本质上是需要运行时一开始就做核心和平台分离的设计,这一点 Vue 2 一开始就做了(所以才会有 weex, NativeScript Vue 等等),实际上有模版这个更简单的编译源,做多端灵活性还更高一点,现在用 Vue 做小程序多端的方案一点都不少啊,mpvue, megalo, uni-app…

至于 Vue 本身使用什么类型系统做内部实现,其实是另一个问题了。用户用 TS 写 Vue 的体验关键还是在 API,用 TS 做内部实现其实只是减少了额外维护 d.ts 的成本。

至于当初为什么没用 TS,我之前的回答相信很多人都看过了,谁能想到 Flow 团队会这么烂尾呢。相比之下,TS 团队确实是在用心做事的。

总结一下:

  • 现有的 API 和类型系统的结合存在缺陷,属于历史遗留;改新的 API 有个时机问题,请耐心等待 Vue 3;

  • TSX 类型支持好是因为 TS 专门开了后门给做了支持;模版只要工具链到位一样可以做到;

  • Vue 2 一开始内部实现就有类型系统,但是没想到 Flow 烂尾了,而 TS 整个生态越做越好。

更多内容,请关注前端之巅。

会议推荐

2019年6月,GMTC全球大前端技术大会2019即将到来。小程序、Flutter、移动AI、工程化、性能优化…大前端的下一站在哪里?点击下图了解更多详情。

尤雨溪回应:Vue与TypeScript为什么相性特别差?相关推荐

  1. 尤雨溪:Vue 3 将成为新的默认版本

    ‍ ‍点击上方"CSCDN精品课",选择"置顶公众号" 第一时间获取精品编程教程 1 月 20 日,Vue 作者尤雨溪在 GitHub 上发布最新公告,表示&q ...

  2. 专访Vue作者尤雨溪:Vue CLI 3.0重构的原因

    1.为什么要对 Vue CLI 进行大规模修改? 尤雨溪认为旧版本的 Vue CLI 本质上只是从 GitHub 拉取模版,这种拉模版的方式有几个问题: (1) 在单个模版里面同时支持太多选项会导致模 ...

  3. 尤雨溪介绍 Vue 3:语法不变、TS 支持很好、2.0 系列还会发一个版本

    此前 Vue 发布了 3.0 的 beta 版本,不久后项目核心开发者尤雨溪公开分享了关于该版本的相关信息. 首先,beta 阶段意味着: 已合并所有计划内的 RFC 已实现所有被合并的 RFC Vu ...

  4. 尤雨溪回应:为什么 Vue 在国际上越来越没影响力?

    来源: https://www.zhihu.com/question/472193255/answer/2235015723 前段时间,知乎上一条「为什么 Vue 在国际上越来越没影响力?」的问题火了 ...

  5. 重磅!尤雨溪公布 Vue 3.0 开发路线

    web前端教程 用大白话,来讲编程 在上周的 Vue.js 伦敦大会上,Vue.js 作者尤雨溪简要介绍了 Vue 下一个主要版本要发布的内容,9 月 30 日,尤雨溪在 medium 个人博客上发布 ...

  6. 尤雨溪:VUE 3 之后会休息一下

    此文转载自:https://my.oschina.net/u/4487475/blog/4631827 LiteOS Studio图形化调测能力,物联网打工人必备!>>> 9 月 1 ...

  7. 尤雨溪:Vue Function-based API RFC

    (给前端大全加星标,提升前端技能) 作者:尤雨溪 https://zhuanlan.zhihu.com/p/68477600 概要 将 2.x 中与组件逻辑相关的选项以 API 函数的形式重新设计. ...

  8. 尤雨溪谈Vue的进化历程

    Vue的进化历程 库阶段 库阶段的重要里程碑: 库阶段的设计重点: 库阶段的特征: 框架阶段 框架阶段的重要里程碑: 框架阶段的设计重点: 通用框架阶段 通用框架阶段的重要里程碑: Vue 2.0 阶 ...

  9. 【VueConf 2022】尤雨溪:Vue的进化历程

    12 月 10 日,第五届 Vue.js 开发者大会(VueConf 2022)由 Vue.js 官方通过在线直播的方式举办.Vue.js 作者尤雨溪发表了题为 <Vue 的进化历程> 的 ...

最新文章

  1. After Effects CS4 期末考试卷
  2. android stack error message is Fail to start the plugin
  3. map/set/object/array对比
  4. 【自动化__持续集成】___java___static
  5. getCurrentSession()与openSession()的区别?
  6. 小波的秘密8_图像处理应用:图像降噪
  7. 联想拯救者y空间兑换代码_锐祥贴片Y电容进入联想手机快充供应链,性能获世界500强认可...
  8. springboot上传文件及文件上传限制大小异常捕获
  9. 资源分享 | 知识蒸馏总结、应用与扩展(2015-2019)
  10. 复习一下,免得下次面试又栽在沟里~
  11. rtmp服务器 协议之同步
  12. 关于Java String对象创建问题解惑
  13. “新基建”提速,数字化硬核人才,你们准备好了吗?
  14. 海信计算机辅助统,海信计算机辅助手术系统(CAS2.2)升级面市
  15. SqlServer2005日志清理
  16. F - 最短路 HDU - 2544(最短路的模板)
  17. Alos 12.5米DEM免费下载教程、高精度DEM数据、土地利用数据、植被类型分布数据、建筑轮廓分布数据
  18. 【大数据实战项目一】数据下载以及工具软件的使用
  19. 剖析STM32F103读写W25Q64
  20. 百度富文本编辑器上传图片到oss的步骤

热门文章

  1. 刚刚,马斯克再次创造航天历史!SpaceX首次载人发射任务成功
  2. 让Hinton后悔投少了的AI公司:吴恩达弟子徒孙创办,LeCun李飞飞Jeff Dean投资,产品让人无法拒绝...
  3. Momenta完全无人驾驶首次曝光!城区道路混行无接管,遭遇逆行也不怕,特斯拉Waymo路线二合一...
  4. 每张脸值5美元,谷歌花钱买数据强化刷脸,还把隔空操控手机变成现实
  5. java多线程系列1:Sychronized关键字
  6. Mysql连接问题:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException
  7. Linux开发环境搭建之Java开发环境JDK安装配置
  8. 在唯一密钥属性“name”设置为“Application”时,无法添加类型为“add”的重复集合项...
  9. vue 本地xlsx文件下载_前端vue下载导出excel和cvs文件
  10. unicode字符显示方框_【硬核】韦东山:字符的编码方式