为什么使用ts-node运行脚本时for..in无法遍历出类的原型方法?
问题核心原因
这个差异是tsc传文件参数时默认不加载tsconfig配置,和不同ECMAScript版本中类方法的可枚举性规则不同两个点共同导致的:
- 你执行
tsc ./src/repro.ts时,只要给tsc命令传入了具体的文件路径,tsc就会忽略项目中的tsconfig.json,使用默认配置编译。tsc 4.3.5的默认编译target是ES3,会把类语法转译为ES5风格的构造函数实现,原型上的do方法是直接赋值给P.prototype的,这种方式定义的属性默认是可枚举的,for...in循环会遍历到原型链上的可枚举属性,所以会输出do。 - ts-node执行时默认会读取项目的tsconfig.json,你配置的target是ES6(ES2015),ES2015规范中,class内部定义的方法默认是不可枚举的,
for...in不会遍历到不可枚举的属性,所以只会输出for in:。
你可以做两个验证确认这个结论:
- 直接执行不带文件参数的
tsc命令,让tsc读取tsconfig.json配置进行编译,生成的代码会保留原生class语法,这时候用node执行编译后的js,也不会输出do - 执行
ts-node --target ES3 ./src/repro.ts,强制指定编译目标为ES3,此时会正常输出do
内容的提问来源于stack exchange,提问作者astef
相关产品推荐
相关产品推荐

