Как включить модули нетипизированных узлов в Typescript 1.8?

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

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

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

import * as injectTapEventPlugin from 'injectTapEventPlugin'; 

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

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

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

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-loader:

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

person Frozen Crayon    schedule 04.02.2016    source источник
comment
Я добавил запрос на перенос для react-tap-event-plugin, и он уже объединен. github.com/DefinitiTyped/DefinentyTyped/pull/8260   -  person mixel    schedule 26.02.2016


Ответы (1)


Новая функция --allowJs не означает, что набор текста будет генерироваться за вас, поэтому вы не можете

import {SomeModule} from 'something';

где 'something' - это простой файл JS - вы должны импортировать его, используя простой синтаксис JS, например

var someModule = require('something');

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

let x: someModule

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

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

person clappski    schedule 07.02.2016
comment
Один из ответов MSFT на их Сообщение в блоге о бета-версии 1.8, похоже, указывает на то, что вы должны иметь возможность получить" форму "модуля без определений типов, поэтому, хотя оно не будет включать информацию о типе, похоже, что это указывает на то, что первоначально OP пробовал, должно было работать AFAICT? текст комментария: @Erki, да. Следует отметить, что файлы JavaScript не несут информацию о типе, поэтому при импорте модуля js вы получите форму модуля, но не информацию о типе, поэтому многие - person James Manning; 07.02.2016
comment
@clappski В статье четко сказано, что Typescript 1.8 теперь поддерживает нетипизированные файлы JS. - person Frozen Crayon; 08.02.2016
comment
На мой взгляд, import {SomeModule} from 'something'; - это простой синтаксис JS с ES2015 ... Итак, если я использую этот оператор импорта в проекте ES2015, а затем хочу перейти на TS, мне придется изменить все операторы import в require (для библиотек, в которых нет типизации, и для моего кода, который еще не перенесен)? ... Это было бы довольно неприятно ... Если это так, то я бы сказал, что TS не является надмножеством JavaScript! - person jbandi; 03.07.2016