初学 TypeScript 遇到几个问题和疑惑:
static
和私有类字段前缀 #
互斥;private
和 #
定义的属性的行为差异,前者开发时提示,编译后类外部仍可以访问该属性,类似伪私有属性,后者任何时候都不能在类外部访问。对于问题 2 和问题 3,我能结合 JS 求同存异,对于问题 1,是我最不能理解的一点。TypeScript 作为 JavaScript 的超集,在我未正式接触的感知中,我一直以为祂是完全兼容 JS 语法或者说直觉祂是对 ES 规范的一种更强大的实现,问题 1 语法在高版本浏览器即使不借助 Babel
编译转化也可以正常执行,TS 却不支持,这是我标题的想要表达疑惑所在,想请问有没有具体的解决方案或者进程中的提案。
我的方案(目前测试项目是基于 rollup 构建的):
rollup & Babel 生态支持伪 TypeScript [ Done ]
借助 Babel 的预设或者插件可以解决问题一,但这是会丧失 type check
,这显然违背了使用 TS 的初衷,不到万不得已本人并不想采用此方案;
rollup & TypeScript [ TODO ]
使用了 rollup 的 TypeScript 插件,其中在 TS 编译之前转化代码的 before
钩子配置,我尝试使用 Babel
的编译功能作为 TS 编译的前置钩子,也就是在 TS 真正编译之前先让 Babel
转化 static #propName
语法,然后再让 TS 编译,目前是理论阶段,因为我的工厂函数失效了,不知道有没有大佬尝试过 before
转化这种 rollup
的 TS 插件配置,请问此思路是否存在可行性。
1
anguiao 2020-12-12 12:43:39 +08:00 via Android
没有系统学过 TS,但是私有属性好像还在 stage 3 吧,并没有正式发布。
而且刚刚搜了一下,TS 3.8 的公告里面有提到支持了私有属性。 |
2
JayLin1011 OP @anguiao 感谢回复,这个更新我知道,默认安装 LTS 版本已经就是 v4+了, `#` 前缀一直可以使用,问题主要在于和 `static` 的共同工作,以及 AST 层面的 `trnasformer` 实现。
|
3
MrYELiex 2020-12-13 09:58:08 +08:00
有啥办法 谁让 es 规范用这种奇奇怪怪的关键字做私有变量 用是不可能用的 这辈子都不可能 只有靠 ts 了
|
4
JayLin1011 OP @MrYELiex 本末倒置,规范才是根本,就好像先有构造函数才有对象,JS / TS 之类的语言都是根据 ES 规范这个构造函数来实例化的, 而且 TS 这是伪私有变量,肯定要有一个真正实现私有的变量的提案。
|
5
JayLin1011 OP 此问题已解决。
借鉴了 `Vue.js` 源码工程化方案和 `TypeScript` 的官方推荐后,使用改进版的方案 1+,即使用 `rollup.js & Babel` 生态支持 `TypeScript` 语法和生成 JS 文件,使用 `tsc` 检查类型和生成声明文件。 PS: 关于方案 2 的 `transformer` 可以加强 `AST` 的认知和 `Babel` 生态的了解。 |
6
xcstream 2021-01-18 02:21:21 +08:00
要么改 ts
要么放弃兼容 |