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