2012-12-12 16 views
8

Có cách nào để nhập khẩu hoặc chú thích module nguyên cảo mà module AMD bên ngoài sẽ tự động được bao gồm như là phụ thuộc khi tạo một module AMD tương thích ?:Tự động bao gồm AMD deps trong mô-đun Typecript AMD?

tsc --module AMD example.ts 

Tôi đã cố gắng để bao gồm cả bao gồm một tham chiếu * tập tin .d.ts, và xuất khẩu kê khai báo cáo:

///<reference path='./lib/knockout-2.2.d.ts' /> 

export declare var $; 
export declare var _; 

export module example { 
    export class Example { 
     // whatever 
    } 
} 

Tuy nhiên các mô-đun tạo không bao gồm những:

define(["require", "exports"], function(require, exports) { 
    (function (example) { 
     var Example = (function() { 
      function Example() { } 
      return Example; 
     })(); 
     example.Example = Example;   
    })(exports.example || (exports.example = {})); 
    var example = exports.example; 
}) 

Thực sự muốn tránh tạo các mô-đun "giả" ở đây.

Nó có vẻ như một giải pháp và sử dụng thoải mái sẽ cho phép nhập khẩu các module AMD trực tiếp:

var $ = import('jquery'); // This is a requirejs/AMD module, not a typescript file. 

nhưng tôi không biết làm thế nào khả thi đó là.

Edit:

Và tôi cũng đã thử phương pháp này đề cập ở đây: Import TypeScript module using only ambient definition for use in amd

import knockout = module("./lib/knockout-2.2.d.ts"); 
... 

nhưng nhận được các lỗi biên dịch:

example.ts(1,32): The name '"./lib/knockout-2.2.d.ts"' does not exist in the current scope 
example.ts(1,32): A module cannot be aliased to a non-module type 
+0

Bạn đã tìm thấy một giải pháp tốt cho việc này? –

+0

Không - trong trường hợp của tôi, tôi bắt đầu nhận ra nó dễ dàng hơn để concat ứng dụng Typecript của tôi vào một tệp đơn ('tsc - out') thay vì lo lắng về AMD, vì không tải bất cứ thứ gì. – 7zark7

+1

Tôi chỉ tìm thấy /// - nhưng trước tiên có thể kiểm tra nó khi tôi về nhà. –

Trả lời

3

Trong các phiên bản gần đây của nguyên cảo cách chính xác để làm điều này là ...

Ví dụ (sẽ xảy ra là jQuery)

Bước 1: Tải file định nghĩa từ NuGet (ví dụ: jquery.nguyên cảo)

Bước 2: Đây là mã (bình luận tài liệu tham khảo là không cần thiết trong Visual Studio):

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

import $ = require('jquery'); 

export module foo { 
    var elem = $('#myid'); 
} 

Các kết quả JavaScript:

define(["require", "exports", 'jquery'], function(require, exports, $) { 
    (function (foo) { 
     var elem = $('#myid'); 
    })(exports.foo || (exports.foo = {})); 
    var foo = exports.foo; 
}); 

Knockout

Một số mọi người gặp sự cố với Knockout ... Kỹ thuật tương tự cũng phù hợp với Knockout ...

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

import ko = require('knockout'); 

export module foo { 
    var obs = ko.observable('example'); 
} 

JavaScript kết quả:

define(["require", "exports", 'knockout'], function(require, exports, ko) { 
    (function (foo) { 
     var n = ko.observable('example'); 
    })(exports.foo || (exports.foo = {})); 
    var foo = exports.foo; 
}); 
4

này:

declare module 'jquery' { export var n; }; 

import $ = module('jquery'); 

export module foo { 
    var n = $.n; 
} 

Sẽ cho kết quả trong một hợp define gọi:

define(["require", "exports", 'jquery'], ... 

Lưu ý rằng nếu bạn không sử dụng một giá trị nhập khẩu ($ trong ví dụ này) ở một vị trí giá trị (như trái ngược với chỉ ở các vị trí loại), các trình biên dịch sẽ tối ưu hóa sự phụ thuộc đó.

+0

Cảm ơn Ryan, sẽ cho nó một shot. Trong khi tôi biết không gian mô-đun JS là một chút lộn xộn với CommonJS, AMD, vv và không phải lỗi của TypeScript - có vẻ như có giá trị để dễ dàng bao gồm các mô-đun bên ngoài trong TS mà không có cách giải quyết này. – 7zark7

+2

không thể làm cho nó để làm việc cho loại trực tiếp. khi nhập khẩu ko = mô-đun ('knockout'), ko thể được sử dụng như ko.observable() sau –

0

Câu trả lời của Ryan đã hoạt động ngoại trừ việc tuyên bố mới ẩn các loại được tham chiếu trong tệp ".d.ts" đã nhận xét ba.

Để khắc phục điều này, bạn có thể muốn cố gắng thay đổi khai báo như thế này:

declare module 'knockout' { export = knockout; } 

tôi không thử nghiệm với loại trực tiếp nhưng các giải pháp nên làm việc với điều đó cũng có.

Các vấn đề liên quan