从私有静态成员看 TypeScript 和 ES 规范的冲突,请问大佬该写法是否有解决方案或 TS 相关的最新提案?

2020-12-12 12:10:06 +08:00
 JayLin1011

初学 TypeScript 遇到几个问题和疑惑:

  1. 静态属性修饰符 static 和私有类字段前缀 # 互斥;
  2. 类字段定义的实例属性作为方法使用时,装饰器语法失效;
  3. 私有属性修饰符 private# 定义的属性的行为差异,前者开发时提示,编译后类外部仍可以访问该属性,类似伪私有属性,后者任何时候都不能在类外部访问。

对于问题 2 和问题 3,我能结合 JS 求同存异,对于问题 1,是我最不能理解的一点。TypeScript 作为 JavaScript 的超集,在我未正式接触的感知中,我一直以为祂是完全兼容 JS 语法或者说直觉祂是对 ES 规范的一种更强大的实现,问题 1 语法在高版本浏览器即使不借助 Babel 编译转化也可以正常执行,TS 却不支持,这是我标题的想要表达疑惑所在,想请问有没有具体的解决方案或者进程中的提案。

我的方案(目前测试项目是基于 rollup 构建的):

  1. rollup & Babel 生态支持伪 TypeScript [ Done ] 借助 Babel 的预设或者插件可以解决问题一,但这是会丧失 type check,这显然违背了使用 TS 的初衷,不到万不得已本人并不想采用此方案;

  2. rollup & TypeScript [ TODO ] 使用了 rollup 的 TypeScript 插件,其中在 TS 编译之前转化代码的 before 钩子配置,我尝试使用 Babel 的编译功能作为 TS 编译的前置钩子,也就是在 TS 真正编译之前先让 Babel 转化 static #propName 语法,然后再让 TS 编译,目前是理论阶段,因为我的工厂函数失效了,不知道有没有大佬尝试过 before 转化这种 rollup 的 TS 插件配置,请问此思路是否存在可行性。

2130 次点击
所在节点    TypeScript
6 条回复
anguiao
2020-12-12 12:43:39 +08:00
没有系统学过 TS,但是私有属性好像还在 stage 3 吧,并没有正式发布。
而且刚刚搜了一下,TS 3.8 的公告里面有提到支持了私有属性。
JayLin1011
2020-12-13 01:36:26 +08:00
@anguiao 感谢回复,这个更新我知道,默认安装 LTS 版本已经就是 v4+了, `#` 前缀一直可以使用,问题主要在于和 `static` 的共同工作,以及 AST 层面的 `trnasformer` 实现。
MrYELiex
2020-12-13 09:58:08 +08:00
有啥办法 谁让 es 规范用这种奇奇怪怪的关键字做私有变量 用是不可能用的 这辈子都不可能 只有靠 ts 了
JayLin1011
2020-12-13 14:57:28 +08:00
@MrYELiex 本末倒置,规范才是根本,就好像先有构造函数才有对象,JS / TS 之类的语言都是根据 ES 规范这个构造函数来实例化的, 而且 TS 这是伪私有变量,肯定要有一个真正实现私有的变量的提案。
JayLin1011
2020-12-13 23:31:29 +08:00
此问题已解决。

借鉴了 `Vue.js` 源码工程化方案和 `TypeScript` 的官方推荐后,使用改进版的方案 1+,即使用 `rollup.js & Babel` 生态支持 `TypeScript` 语法和生成 JS 文件,使用 `tsc` 检查类型和生成声明文件。

PS: 关于方案 2 的 `transformer` 可以加强 `AST` 的认知和 `Babel` 生态的了解。
xcstream
2021-01-18 02:21:21 +08:00
要么改 ts
要么放弃兼容

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/734745

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX