2

我该怎么做?用TypeScript定义Durandal ViewModel

我看过的一些例子,看起来可怕的例如,下面的内容看起来不像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-exports对象上创建属性?这就像一个突变通过引用。
  2. 还有更多的OO方式吗?我可以看到自己出口一门课,但这太奇怪了,违背了我认为是对的,公正的一切。好吧,这太夸张了,但确实有这种感觉。

回答

1

产生的代码是不是要好得多,这是DI-ING这个变量称为出口和代码只是不断添加属性到它,这没有任何意义。

这是web(amd)的工作方式。它依赖于requirejs: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对象 - 这我能理解,适当的工厂方法/类。更少的工作,更清洁,没有时间浪费编译。

您可以通过使用外部模块与--out标志编译与打字稿做到这一点。

为什么代码在DI导出对象上创建属性?这就像一个突变通过引用。 还有更多的OO方式吗?我可以看到自己出口一门课,但这太奇怪了,违背了我认为是对的,公正的一切。好吧,这太夸张了,但确实有这种感觉。

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

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