如何在Typescript 1.8中包含无类型的节点模块?

时间:2016-02-04 12:43:41

标签: javascript typescript ecmascript-6 node-modules ts-loader

  

Typescript 1.8现在支持无类型的JS文件。要启用此功能,   只需添加编译器标志--allowJs或添加“allowJs”:true即可   tsconfig.json中的compilerOptions

通过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"
  ]
}

我正在使用带有ts-loader的webpack:

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

1 个答案:

答案 0 :(得分:5)

新的--allowJs功能并不意味着会为您生成打字,因此您无法做到

import {SomeModule} from 'something';

哪里有什么'是一个普通的JS文件 - 你必须使用普通的JS语法导入它,例如

var someModule = require('something');

如果你没有导入的.d.ts文件,你将无法使用任何类型的注释,例如

let x: someModule

无效。如果您想要导入类型注释,智能感知和任何其他TypeScript功能,您必须为它提供.d.ts文件,或者为您需要的位创建自己的接口。

阅读文档时,看来此功能主要适用于从.js转换为.ts的用户,以便他们可以逐步重写其.js文件。此外,它还用于将您的外部代码与您自己的代码捆绑在一起,并且使您可以使用webpack或browserify等工具捆绑/连接文件。