2015-10-22 4 views
5

Я пытаюсь расширить интерфейс по умолчанию JQuery и объект по умолчанию jQuery функции в машинописноммашинописи продлить JQuery под пространством имен

Code

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

namespace MyNameSpace { 
    var $ = jQuery; 
    export interface JQuery { 
     test(options: Object): JQuery; 
    } 
    $.fn.test = function(options: Object): JQuery { 
     if (this.length === 0) { 
      console.log('Error!'); 
      return this; 
     } 
     console.log(options); 
     return this; 
    } 
    export var testBody = function() { 
     jQuery('body').test({ 'HELLO': 'TEST' }); 
    } 
} 

Проблему

Теперь я запускаю следующий код в консоли: tsc -m amd -t ES5 Test.ts -d

Я получаю эту ошибку: Test.ts(17,19): error TS2339: Property 'test' does not exist on type 'JQuery'.

Любое решение для этого?

ответ

10

Это работает для меня:

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

interface JQuery { 
    test(options: Object): JQuery; 
} 

namespace MyNameSpace { 
    var $ = jQuery; 

    $.fn.test = function(options: Object): JQuery { 
     if (this.length === 0) { 
      console.log('Error!'); 
      return this; 
     } 
     console.log(options); 
     return this; 
    }; 
    export var testBody = function() { 
     jQuery('body').test({ 'HELLO': 'TEST' }); 
    } 
} 

EDIT: второе решение

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

namespace MyNameSpace { 

    interface JQueryX extends JQuery { 
     test(options: Object): JQuery; 
    } 

    $.fn.test = function(options: Object): JQuery { 
     if (this.length === 0) { 
      console.log('Error!'); 
      return this; 
     } 
     console.log(options); 
     return this; 
    }; 

    export var testBody = function() { 
     let a:JQueryX = <JQueryX>$('body'); 
     a.test({ 'HELLO': 'TEST' }); 
     // OR 
     (<JQueryX>$('body')).test({ 'HELLO': 'TEST' }); 
    } 
} 

Вы можете сделать testBody лучше некоторым рефакторинга.