2016-02-04 3 views
12

Typcript 1.8 теперь поддерживает нетипированные файлы JS. Чтобы включить эту функцию, просто добавить --allowJs флаг компилятора или добавить «allowJs»: верно compilerOptions в tsconfig.jsonКак включить нетипизированные узловые модули с TypScript 1.8?

через https://blogs.msdn.microsoft.com/typescript/2016/01/28/announcing-typescript-1-8-beta/

Я пытаюсь импортировать react-tap-event-plugin, который не делает есть файл типизации.

import * as injectTapEventPlugin from 'injectTapEventPlugin'; 

говорит, что модуль не найден. Поэтому я попробовал:

import * as injectTapEventPlugin from '../node_modules/react-tap-event-plugin/src/injectTapEventPlugin.js'; 

Это говорит о том, что модуль разрешает немодульный объект и не может быть импортирован с использованием этой конструкции. А потом я попробовал:

import injectTapEventPlugin = require('../node_modules/react-tap-event-plugin/src/injectTapEventPlugin.js'); 

Это сбой с ERROR in ./scripts/index.tsx Module build failed: TypeError: Cannot read property 'kind' of undefined на node_modules/typescript/lib/typescript.js:39567

Мой TSconfig:

{ 
    "compilerOptions": { 
    "target": "ES5", 
    "removeComments": true, 
    "jsx": "react", 
    "module": "commonjs", 
    "sourceMap": true, 
    "allowJs": true 
    }, 
    "exclude": [ 
    "node_modules" 
    ] 
} 

Я использую Webpack с TS-погрузчик:

{ 
    test: /\.tsx?$/, 
    exclude: ['node_modules', 'tests'], 
    loader: 'ts-loader' 
} 
+0

Я добавил запрос на pull для 'response-tap-event-plugin', и он уже слит. https://github.com/DefinitelyTyped/DefinitelyTyped/pull/8260 – mixel

+0

@mixel wow спасибо! –

ответ

5

новая функция --allowJs не означает, что для вас будут созданы типизации, так что вы можете «Т сделать

import {SomeModule} from 'something'; 

где„что-то“является текстовым файлом JS - вы должны импортировать его с помощью обычного синтаксиса JS, например,

var someModule = require('something'); 

Если вы не имеете .d.ts файл для импорта, вы не сможете использовать любые аннотации типа, например,

let x: someModule 

будет недействительным. Если вам нужны аннотации типа, intellisense и любые другие функции TypeScript для импорта, вам придется придумать для этого файл .d.ts или создать свои собственные интерфейсы для необходимых вам битов.

Чтение документации, похоже, эта функция предназначена главным образом для людей, переходящих из .js в .ts, чтобы они могли поэтапно переписывать свои .js-файлы. Кроме того, он используется для связывания ваших внешних с вашим собственным кодом и позволяет вам связывать/объединять файлы с помощью инструмента, такого как webpack или браузера.

+1

Один из ответов MSFT на их [1.8 бета-блоге] (https://blogs.msdn.microsoft.com/typescript/2016/01/28/announcing-typescript-1-8-beta/#comments) кажется указывают, что вы должны иметь возможность получить «форму» модуля без определений типов, поэтому, хотя он не будет включать информацию о типе, он, похоже, указывает, что то, что первоначально пыталось ОП, должно было работать AFAICT? Текст комментария: @ Эрки, да. Одно дело отметить, что файлы JavaScript не содержат информацию о типе, поэтому импорт модуля js даст вам «форму» модуля, но информации о типе нет, поэтому многие из них –

+1

@clappski В статье четко сказано «Тип 1.8 теперь поддерживает нетипизированные JS-файлы » –

+3

На мой взгляд,' import {SomeModule} из 'something'; 'is * plain JS syntax * с ES2015 ... Поэтому, если я использую этот оператор импорта в проекте ES2015, а затем хотел бы мигрировать в TS, тогда мне пришлось бы менять все операторы 'import' в' require' (для библиотек, у которых нет пиктограмм, и для моего кода, который еще не перенесен)? Это было бы очень больно ... Если это так, то я бы сказал, что TS не является * расширением * JavaScript! – jbandi

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