Javascript 使用Ember.js捕捉代码错误的更好实践(特别是混乱的变量名)

Javascript 使用Ember.js捕捉代码错误的更好实践(特别是混乱的变量名),javascript,ember.js,ember-data,Javascript,Ember.js,Ember Data,在Ember.js中,我们使用Ember自己的对象变量,建议/必须使用this.get和this.set,以便访问对象属性 我(大部分)理解为什么会这样做,并欣赏它为Ember编程体验增加的一致性和灵活性,但我确实觉得我在IDE的健全性检查方面失败了 对于Jetbrain产品(或任何具有深入分析和完善功能的优秀IDE),我通常可以依靠符号建议来确保选择了正确的变量名。用余烬输入字符串依赖于我正确的名字,而我是一个容易出错的人 关于可能的解决办法,我有一些想法 一些IDE插件进行静态分析,以建议

在Ember.js中,我们使用Ember自己的对象变量,建议/必须使用
this.get
this.set
,以便访问对象属性

我(大部分)理解为什么会这样做,并欣赏它为Ember编程体验增加的一致性和灵活性,但我确实觉得我在IDE的健全性检查方面失败了

对于Jetbrain产品(或任何具有深入分析和完善功能的优秀IDE),我通常可以依靠符号建议来确保选择了正确的变量名。用余烬输入字符串依赖于我正确的名字,而我是一个容易出错的人

关于可能的解决办法,我有一些想法

  • 一些IDE插件进行静态分析,以建议使用正确的字符串
  • 一种ES6或替代的transpired语言,默认情况下以ember方式访问成员
  • 在需要的地方自动建立字符串常量的某种方法
  • 一些余烬调试设置,如果我试图获取一个尚未定义的变量,它至少会发出警告
  • 我还发现,如果余烬发现我试图将属性设置为undefined,那么抛出警告也很有用
希望有人会告诉我,这些解决方案中有一个是存在的,有更好的想法,或者我的问题不是真正的问题

(举例说明我的问题:) 在下面的代码片段中

  const email = this.get('email');

  const newInvitation = this.store.createRecord('invitation', {email: email});
我正在尝试获取属性
email
,但真正想要获取的属性是
emailAddress
。当我创建记录时,我使用一个未定义的电子邮件字段来创建记录,该字段直到代码后面才会被捕获


调试并不可怕,但如果每次拼写错误时都要手动筛选每一行代码,我将浪费大量时间,成为一个令人伤心的调试男孩。救命啊

目前我们还没有一个很好的解决方案。然而,未来看起来是光明的

目前,存储库中正在进行大量的工作,以构建一个typescript定义,该定义将允许typescript语言服务器完成这项工作。这将在不久的将来为
This.get('foo')
之类的内容提供补全,但不会为
This.get('foo.bar')
之类的内容提供补全

此外,我还构建了一个,它允许您在支持的浏览器上省略
.get
.set
。然而,这更多的是一个概念证明,然后你应该在生产中使用

如果您访问的属性为null,您只需要调试消息,则可以使用
未知属性

unknownProperty(key) {
  console.log('access to unknown property');
}
但是,我有时需要访问以下代码的未知属性:

if(!obj.get('foo')) {
  obj.set('foo', 'bar');
}

所以总的来说,我建议您尝试使用typescript,因为这可能是一种很快会给您带来良好开发体验的解决方案,同时也会得到社区的良好支持。有趣的是,这也表明,ember倾向于标准的ES类,在某些情况下,我们根本不会
.set
.get
。 此外,glimmer集成正在向前发展,在glimmer组件中,您不需要
.set
.get


我也不推荐你使用灰烬脚本。我试过了,但基本上没有人使用它,也没有任何支持。

目前我们没有一个很好的解决方案。然而,未来看起来是光明的

目前,存储库中正在进行大量的工作,以构建一个typescript定义,该定义将允许typescript语言服务器完成这项工作。这将在不久的将来为
This.get('foo')
之类的内容提供补全,但不会为
This.get('foo.bar')
之类的内容提供补全

此外,我还构建了一个,它允许您在支持的浏览器上省略
.get
.set
。然而,这更多的是一个概念证明,然后你应该在生产中使用

如果您访问的属性为null,您只需要调试消息,则可以使用
未知属性

unknownProperty(key) {
  console.log('access to unknown property');
}
但是,我有时需要访问以下代码的未知属性:

if(!obj.get('foo')) {
  obj.set('foo', 'bar');
}

所以总的来说,我建议您尝试使用typescript,因为这可能是一种很快会给您带来良好开发体验的解决方案,同时也会得到社区的良好支持。有趣的是,这也表明,ember倾向于标准的ES类,在某些情况下,我们根本不会
.set
.get
。 此外,glimmer集成正在向前发展,在glimmer组件中,您不需要
.set
.get


我也不推荐你使用灰烬脚本。我尝试过,但基本上没有人使用它,也没有任何支持。

仍然迫切需要对此提供意见,但我自己找到的一个解决方案是。我认为这个解决方案不能充分满足我的文章的前提,因为大多数IDE都不支持EmberScript。虽然它确实用适当的标识符代替了字符串查找,但这样做的价值是没有意义的,因为我们无法使用IDE代码分析来利用它。(另外,对于一个解决方案的侵入性来说,它有点不稳定/缺乏维护)。仍然迫切需要在这方面的投入,但我自己发现的一个解决方案是。我认为这个解决方案不能充分满足我的文章的前提,因为大多数IDE都不支持EmberScript。虽然它确实用适当的标识符代替了字符串查找,但这样做的价值是没有意义的,因为我们无法使用IDE代码分析来利用它。(另外,对于解决方案的侵入性来说,它有点不稳定/缺乏维护)。非常好,全面的回答,谢谢!我在Angular2和React项目中使用ts,如果这能让我的工作更轻松,我会很激动。我明白你说的“未知财产”是什么意思了,有没有办法