2015-10-14 6 views
1

Есть ли способ, которым я могу иметь класс TypeScript, экспортированный как модуль UMD со строгим режимом? «Gotcha» - это часть строгого режима.TypeScript Class экспортируется как модуль UMD со строгим режимом

Мой код выглядит примерно так:

class Foo { 
    bar(): Foo.Bam {} 
} 

namespace Foo { 
    export function boom() {} 
    export interface Bam {} 
} 

export = Foo; 

В другом месте модуль может быть использован как:

import * as Foo from 'my-module'; 

var foo = new Foo(); 
foo.bar() 

Foo.boom(); 

interface Kaboom extends Foo.Bam {} 

Я хочу строгий режим, чтобы применить ко всем Foo, но не весь сценарий, так как это может быть связано с другими неизвестными сценариями.

Файл определения также создается.

Я могу просто обернуть все в закрытии во время процесса сборки, но сначала я ищу предварительное компиляционное решение.

Edit:

Добавлено более подробную информацию на мой вопрос, только в случае, если кто-то находит путь в будущее.

В итоге я просто добавил простое исправление после компиляции. После создания модуля UMD. Я заменить эту строку:

})(["require", "exports"], function (require, exports) { 

С этой линией:

})(["require", "exports"], function (require, exports) {"use strict"; 

Теперь все внутри модуля является строгим, и сам сценарий не является.

+0

Это то, что вы ищете https://pastee.org/kzp82? (Я поставил код на http://www.typescriptlang.org/Playground) –

+0

Нет, его нужно экспортировать с помощью '--module umd', спасибо, хотя :) – thoughtrepo

ответ

1

Если вы используете свои модули стандартным способом (т. Е. Загружаете их по мере необходимости), вы можете добавить их в начало файла - инструкция будет привязана к файлу.

"use strict" 

class Foo { 
    bar() {} 
} 

namespace Foo { 
    export function bar() {} 
} 

export = Foo; 

Если вы на самом деле совмещая вывод в один файл, вы не можете ограничить область заявления без введения пространств имен (в сторону: Я не поклонник внутренних модулей/пространств имен).

namespace Example { 
    "use strict" 

    export class Foo { 
     bar() {} 
    } 
} 

namespace Foo { 
    export function bar() {} 
} 

export = Example.Foo; 
+0

Нет проблем, когда он ленивый. Тем не менее, когда модуль поставляется вместе с другими модулями для использования в производстве (requirejs), я не хочу, чтобы там был обычный режим. Модуль будет общедоступным, поэтому я просто пытаюсь покрыть свои базы. Второй вариант добавления другого пространства имен работает до тех пор, пока я не попытаюсь создать файл определения; ошибка TS4082. Я закончил просто выполнение исправления скрипта сборки, но я уточню свой вопрос с подробностями. Благодаря :) – thoughtrepo