Defining Durandal ViewModel with TypeScript



我该怎么做?

我看到的一些例子,看起来很可怕例如,下面的例子,读起来根本不像OO代码,因此,如果TypeScript是一个黑客,它有什么意义。由于没有类定义,我根本无法完全理解以下内容。所以我有一个编译过的代码,没有智能感知,不能强制执行封装等——为什么要浪费时间呢?

/// <reference path="../durandal/durandal.d.ts" />
/// <reference path="../../scripts/knockout.d.ts" />
import app = require("durandal/app");
import http = require("durandal/http");
export function activate() {
.
.
.
}

其他的例子更为怪异,比如导出一个变量声明。

生成的代码也好不到哪里去,它正在DI这个名为exports的变量,而代码只是不断地向它添加属性,这是没有意义的。

如果我用javascript写这一切,我会返回一个新的对象,它可能是JSON表示法——我可以理解,一个合适的工厂方法/类。更少的工作,更干净,没有浪费时间编译。

有人能解释一下发生了什么吗?

  1. 为什么代码在DI edexports对象上创建属性?这就像一个变种人通过参考
  2. 有没有一种更OO的方法可以做到这一点?我可以看到自己导出了一个类,但这太奇怪了,违背了我认为正确和公正的一切。好吧,这有点夸张,但确实有这种感觉

生成的代码也好不到哪里去,它正在DI这个名为exports的变量,而代码只是不断向它添加属性,这没有意义。

这就是web(amd)的工作方式。它取决于需求:http://requirejs.org/甚至jquery(从https://github.com/jquery/jquery/tree/master/src)使用类似的模式,例如:https://github.com/jquery/jquery/blob/master/src/deferred.js#L1-L5

如果我用javascript写这一切,我会返回一个新的对象,它可能是JSON表示法——我可以理解,是一个合适的工厂方法/类。更少的工作,更干净,没有浪费时间编译。

您也可以使用TypeScript执行此操作,方法是而不是使用外部模块并使用--out标志进行编译。

为什么代码在DI导出对象上创建属性?这就像一个变种人通过参考。有没有一种更OO的方法可以做到这一点?我可以看到自己导出了一个类,但这太奇怪了,违背了我认为正确和公正的一切。好吧,这有点夸张,但确实有这种感觉。

您需要了解外部/内部模块。简而言之,外部模块依赖于模块系统(浏览器的amd,由requirejs提供,服务器的commonjs,例如nodejs)。如果你从未听说过amd/commonjs,你可能不应该在意。除了你试图使用的库(durandal)需要你使用它。这意味着你的javascript代码不会像你想象的那么简单。

附言:我有一个视频解释打字模块系统:http://www.youtube.com/watch?hd=1&v=KDrWLMUY0R0