2012-10-22 18 views
16

Tôi có một mô-đun phụ thuộc vào Backbone. Tôi có một định nghĩa backbone.d.ts nhưng nguyên cảo dường như không muốn để biên dịch mô-đun của tôi trừ khi tôiNhập mô-đun TypeScript chỉ sử dụng định nghĩa môi trường xung quanh để sử dụng trong amd

import Backbone = module("backbone") 

thực trỏ đến một mô-đun xương sống có giá trị như trái ngược với một tập tin định nghĩa. Tôi đang sử dụng các mô-đun tải AMD và có một shim requirejs được định nghĩa cho xương sống.

Có cách giải quyết nào khác ngoài việc tạo định nghĩa mô-đun backbone.ts không?

Cập nhật: Tác dụng phụ của giải pháp là mã như vậy không còn hoạt động vì mô-đun không còn tồn tại nữa. Nó cần phải tồn tại vì shim requirejs. Cách giải quyết duy nhất tôi biết là có hai tệp .d.ts. Một tệp cho tệp sử dụng xương sống dưới dạng tệp nhập không bao gồm bit declare module. Cách khác để sử dụng một số /// <reference bao gồm dòng declare module.

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

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

Trả lời

9

Ngôn ngữ TypeScript đã thay đổi một chút vì câu trả lời gốc này.

Ví dụ, để nhập khẩu một mô-đun bên ngoài bạn sử dụng require (câu trả lời ban đầu của tôi đã cũ module từ khóa):

Đây là một trường hợp sử dụng phổ biến đối với nhập khẩu xương sống - bằng cách sử dụng loại thông tin từ Chắc chắn Typed:

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

import bb = require('backbone'); 

trong định nghĩa kiểu, module xương sống được khai báo cho bạn, đó là những gì cho phép nhập khẩu có giá trị:

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

declare module "backbone" { 
    export = Backbone; 
} 

Vậy câu hỏi ban đầu có thể được giải quyết bằng ...

/// <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; 
} 

Ví dụ mã này, đây là tất cả những gì cần thiết - nhưng thường xuyên hơn, bạn sẽ muốn thư viện xương sống nạp trong thời gian chạy ... bạn có thể sử dụng nhận xét amd-dependency (chính thức được thử nghiệm) để gây ra lệnh gọi hàm define được tạo ra để bao gồm xương sống.

/// <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

Tôi chỉ cố gắng này thật trong Visual Studio và tôi tạo lại vấn đề của bạn. Hãy để tôi xem nếu tôi có thể sửa lỗi này! – Fenton

+1

Trong thử nghiệm của tôi, tôi đã tìm thấy Tuyên bố môi trường xung quanh phải bỏ qua khối 'module', giống như một mô-đun bình thường trong AMD hoặc CommonJS. – Fenton

+0

Tuyệt vời, cảm ơn! – ryan

7

Có thực sự là một cách khác để xử lý trong :

  1. Clone kho DefinitelyTyped Github. Nó chứa jquery.d.ts, backbone.d.ts và rất nhiều tệp định nghĩa khác.

  2. liên kết các tập tin định nghĩa tập tin myfile.ts của bạn:
    /// <reference path="DefinitelyTyped/requirejs/require.d.ts" />
    /// <reference path="DefinitelyTyped/jquery/jquery.d.ts" />

  3. Thêm một sự phụ thuộc amd vào thư viện javascript:
    /// <amd-dependency path="jquery"/>

  4. Để sử dụng $ bên trong tập tin myfile.ts của bạn, bạn bây giờ có thể gọi yêu cầu:
    var $ = require("jquery");

Phiên bản đầy đủ của 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); 
} 

Nếu bạn chạy tsc --module amd myfile.ts bạn sẽ nhận được đoạn mã sau javascript:

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

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

Thú vị, tôi đã không thấy '' trước – ryan

+0

khiến tôi thoát khỏi lỗi của tôi, cảm ơn! –

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