2017-01-25 2 views
0

Например, у меня есть модуль AMD в ванильных JS (не тронуты tsc):Как сопоставить импорт по умолчанию для импорта по типу TypeScript ES6 для возврата значений модулей AMD?

// Foo.js 
define([], function() { 
    return class Foo {} 
}) 

с сопровождающей декларации файла:

// Foo.d.ts 
declare class Foo { 
    // ... 
} 

export default Foo 

тогда у меня есть модуль машинопись:

// app.ts 
import Foo from './Foo' 
new Foo // Uncaught TypeError: Foo_1.default is not a constructor 

Когда я скомпилировал свой модуль ввода текста в формате AMD с помощью tsc и запустил его в моей среде RequireJS, произошла ошибка default не определен, потому что машинописный компилирует:

define("app", ["require", "exports", "Foo"], function (require, exports, Foo_1) { 
    "use strict"; 
    console.log(Foo_1["default"]); 
}); 

Я не хочу, чтобы захватить default собственность. Я хочу, чтобы он обрабатывал импорт по умолчанию, поскольку он просто захватывает возвращаемое значение моего модуля определения. Каждый модуль в моем проекте представляет собой модуль define() или машинописный модуль, составленный до define() (AMD). Я просто хотел бы получить этот объект возврата.

Есть ли способ сделать это?

EDIT:

Я знаю, что могу import * as Foo from './Foo', но это своего рода Hacky, и это приводит к ошибкам, так как заявленная модуль не назвал экспорт. Я хотел бы, если это возможно, использовать метод без ошибок.

EDIT: Я узнал, что я могу просто сделать

// app.ts 
import Foo = require('./Foo') 
new Foo // no error 

для достижения результата. Единственная проблема с этим - это не совместимость с ES6. Это означает, что если мы говорим машинописному описанию о том, чтобы оставить инструкции импорта ES6 как есть, тогда другие инструменты не будут понимать спецификации импорта/экспорта, специфичные для типов. Мне нужен способ использовать только официальный синтаксис модуля ES6 разумным способом.

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

ответ

0

Попробуйте

import * as Foo from './Foo' 
+0

Это забавный способ, чтобы получить Foo. Если у меня есть 'tsc' игнорировать ошибки и все еще испускать пакет, это работает. Но есть ошибки, потому что файл '.d.ts' выглядит так, как он есть (см. Обновленный вопрос). Есть еще предложения? – trusktr

+0

О, я полагаю, что 'import Foo = require ('./ Foo')' работает, но это не ES6, поэтому, если код когда-либо используется в других средах, где TS только компилирует язык, но оставляет синтаксис модуля в одиночку, т работы. Или это будет? – trusktr

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