我尝试在Backbone.js中使用TypeScript。它“工作正常”,但是Backbone的get()和set()丢失了很多类型安全。我尝试编写一个helper方法来恢复类型安全。如下所示:
我会在我的模型中加入这个:
object() : IMyModel {
return attributes; // except I should use get(), not attributes, per documentation
}
而这在消费者中:var myVar = this.model.object().MyProperty;
通过这种语法,我可以让TypeScript知道MyProperty存在并且是bool,这很棒。但是,backbone.js文档告诉我使用get和set而不是直接使用属性哈希。那么,有没有什么神奇的Javascript方法可以正确地通过get和set来使用该对象呢?
4条答案
按热度按时间kr98yfug1#
我们大量使用 Backbone 网和TypeScript,并提出了一个新颖的解决方案。
请考虑以下代码:
请注意,接口定义了模型的属性,构造函数确保传递的任何对象都具有Id、Name和Description属性。for语句只调用每个属性上的 Backbone.js 集。这样,下面的测试就会通过:
**更新:**我已经更新了代码库以使用ES5 get和set语法,以及构造函数。基本上,你可以使用Backbone .get和.set作为内部变量。
gv8xihay2#
我使用泛型和ES 5 getter/setter,在/u/blorkfish答案的基础上得出了以下结果。
注意:Backbone.Model defaults是可选的,但是因为我们用它来构建getter和setter,所以现在它是强制的。抛出的错误迫使你这样做。也许我们可以想到一个更好的方法?
使用方法:
它比理想情况下要稍微冗长一些,并且要求您使用默认值,但它运行得很好。
n8ghc7c13#
这里有一个使用装饰器的方法,创建一个这样的基类:
然后创建自己的类,如下所示:
并使用它:
bnl4lu3b4#
我也在为同样的问题而挣扎,但我想我在TypeScript聊天组中找到了一个有趣的解决方案。这个解决方案看起来很有前途,我想在这里分享它。所以我的代码现在看起来像这样
第一个
我得到的另一个好处是,它检查默认值和构造函数参数是否符合接口。