2015-04-29 3 views
1

Я хочу определить класс внутри IIFE, используя TypeScript, и продолжает получать ошибку, class can be defined either in a module or a file. Ниже код не работает.Тип: Не удается определить класс внутри IIFE

(function(){ 
    // Error here 
    class Person { 

    } 
})() 

Причина, по которой я должен это делать, заключается в том, что я не хочу выставлять какие-либо глобальные переменные, даже модуль. Вы можете задаться вопросом, почему, потому что я хотел бы добавить их в угловых модулей ниже образом

(function(){ 
    angular.module('app').controller('HomeController', HomeController); 
    // error here 
    class HomeController { 
    } 
})(); 
+0

Typcript уже обертывает содержимое класса в 'function()', поэтому я не уверен, чего вы хотите достичь - просто проверьте сгенерированный код на http://www.typescriptlang.org/Playground/. Или я неправильно понял вас? –

+1

Я думаю, что это будет возможно [с TS 1.6] (https://github.com/Microsoft/TypeScript/wiki/Roadmap#16): «Поддержка локальных типов и выражений класса». – Paleo

ответ

4

Когда вы создаете класс, он генерирует IIFE для вас:

Класс:

class Example { 

} 

Результаты в JavaScript:

var Example = (function() { 
    function Example() { 
    } 
    return Example; 
})(); 

Если вы хотите, чтобы ваши классы выходили из глобального масштаба, вы можете как таковые модули:

module Stack { 
    export class Example { 

    } 

    export class Overflow { 

    } 
} 

только появляется Stack модуль в глобальном масштабе.

var Stack; 
(function (Stack) { 
    var Example = (function() { 
     function Example() { 
     } 
     return Example; 
    })(); 
    Stack.Example = Example; 
    var Overflow = (function() { 
     function Overflow() { 
     } 
     return Overflow; 
    })(); 
    Stack.Overflow = Overflow; 
})(Stack || (Stack = {})); 

Если вы хотите пойти на шаг дальше, вы можете использовать внешние модули - когда вы сделаете это, ни один из ваших классов или модулей не добавляется в глобальном масштабе.

+0

Но 'Stack' выставлен и khagesh" не хотят выставлять какие-либо глобальные переменные ". – Paleo

+3

Я показал ряд решений, последний из которых имеет нулевой глобальный охват (внешние модули). Цель zero-global-scope замечательна, но мне нравится давать ответы, которые помогут другим людям искать меньше предметов в глобальной области, а также нулевые элементы. – Fenton

+0

@SteveFenton, как сказал Тарх, он по-прежнему выставляет Stack как глобальную переменную. И использование внешних модулей означает, что вам придется использовать require.js для клиентской стороны. Он все еще не решает проблему. – khagesh

Смежные вопросы