2012-10-22 42 views
16

我有一個模塊取決於Backbone。我有一個backbone.d.ts定義,但打字稿似乎並不想編譯我的模塊,除非我的導入只使用環境定義的TypeScript模塊在amd中使用

import Backbone = module("backbone") 

實際指向一個有效的骨幹模塊,而不是一個定義文件。我正在使用AMD加載的模塊,併爲骨幹網定義了requirejs填充程序。

除了創建一個虛假的backbone.ts模塊定義之外,還有一種解決方法嗎?

更新:解決方案的副作用是由於模塊不再存在,此類代碼不再有效。它需要存在,因爲requirejs墊片。我知道的唯一解決方法是有兩個.d.ts文件。一個用於使用骨幹作爲導入的文件,不包括declare module位。另一個使用/// <reference,包括declare module行。

/// <reference path="../dep/backbone/backbone.d.ts" /> 

interface IApi { 
    version: number; 
    Events: Backbone.Events; 
} 

回答

9

自原來的答案以來,TypeScript語言已經改變了一個公平的位。

例如,導入使用require外部模塊(我原來的答覆有老module關鍵字):

這是一種常見的用例輸入骨幹 - 利用絕對輸入的類型信息:

/// <reference path="scripts/typings/backbone/backbone.d.ts" /> 

import bb = require('backbone'); 

中的類型定義,主幹模塊被宣佈爲你,這是允許進口是有效的:

//... lots of code and then... 

declare module "backbone" { 
    export = Backbone; 
} 

所以原來的問題可以用得到解決......

/// <reference path="scripts/typings/backbone/backbone.d.ts" /> 

import bb = require('backbone'); 

interface IApi { 
    version: number; 
    Events: bb.Events; 
} 

class Api implements IApi { 
    public version = 1; 
    public Events: bb.Events = null; 
} 

對於此代碼示例,這是所有必需的 - 但更多的時候,你需要在運行時加載的骨幹庫...您可以使用(官方實驗)amd-dependency評論,導致生成的define函數調用包含主幹。

/// <reference path="scripts/typings/backbone/backbone.d.ts" /> 
/// <amd-dependency path="backbone" /> 

import bb = require('backbone'); 

interface IApi { 
    version: number; 
    Events: bb.Events; 
} 

class Api implements IApi { 
    public version = 1; 
    public Events: bb.Events = null; 
} 
+1

我只是在Visual Studio中嘗試這種真正的和我重新創建您的問題。讓我看看我能否解決這個問題! – Fenton

+1

在我的測試中,我發現環境聲明必須省略'module'塊,就像AMD或CommonJS中的普通模塊一樣。 – Fenton

+0

非常好,謝謝! – ryan

7

其實還有另一種方式來處理

  1. 克隆DefinitelyTyped Github上庫。它包含了jquery.d.ts,backbone.d.ts以及其他許多定義文件。

  2. 定義鏈接文件到您的myfile.ts文件:
    /// <reference path="DefinitelyTyped/requirejs/require.d.ts" />
    /// <reference path="DefinitelyTyped/jquery/jquery.d.ts" />

  3. 加入AMD依賴於JavaScript庫:
    /// <amd-dependency path="jquery"/>

  4. 要使用$myfile.ts文件裏面你現在可以撥打要求:
    var $ = require("jquery");

myfile.ts完整版:

/// <reference path="DefinitelyTyped/requirejs/require.d.ts" /> 
/// <reference path="DefinitelyTyped/jquery/jquery.d.ts" /> 
/// <amd-dependency path="jquery"/> 
var $ = require("jquery"); 

export function helloWorld() { 
    $("<div>Hello World</div").appendTo(document.body); 
} 

如果運行tsc --module amd myfile.ts你會得到下面的JavaScript代碼:

define(["require", "exports", "jquery"], function(require, exports) { 
    var $ = require("jquery"); 

    function helloWorld() { 
     $("<div>Hello World</div").appendTo(document.body); 
    } 
    exports.helloWorld = helloWorld; 
}); 
+0

有趣的是,我在 – ryan

+0

之前沒有看到過''讓我擺脫了我的錯誤,謝謝! –

相關問題