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

Posted

技术标签:

【中文标题】如何在 Typescript 1.8 中包含无类型节点模块?【英文标题】:How to include untyped node modules with Typescript 1.8? 【发布时间】:2016-05-14 02:02:14 【问题描述】:

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';

这表示 Module 解析为非模块实体,无法使用此构造导入。然后我尝试了:

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

node_modules/typescript/lib/typescript.js:39567ERROR in ./scripts/index.tsx Module build failed: TypeError: Cannot read property 'kind' of undefined 崩溃

我的 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'
 

【问题讨论】:

我添加了 react-tap-event-plugin 的拉取请求,它已经合并了。 github.com/DefinitelyTyped/DefinitelyTyped/pull/8260 【参考方案1】:

新的 --allowJs 功能并不意味着会为你生成类型,所以你不能这样做

import SomeModule from 'something';

'something' 是一个纯 JS 文件 - 你必须使用纯 JS 语法导入它,例如

var someModule = require('something');

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

let x: someModule

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

阅读文档,看来此功能主要是针对从 .js 转换为 .ts 的人,以便他们可以逐步重写他们的 .js 文件。此外,它还用于将您的外部代码与您自己的代码捆绑在一起,从而使您不必使用 webpack 或 browserify 之类的工具捆绑/连接文件。

【讨论】:

MSFT 在其1.8 beta blog post 上的回复之一似乎表明您应该能够在没有类型定义的情况下获得模块的“形状”,因此虽然它不包含类型信息,但它似乎表明最初尝试的 OP 应该对 AFAICT 有效?评论文字:@Erki,是的。需要注意的一点是,javascript 文件不携带类型信息,因此导入 js 模块会得到模块的“形状”,但没有类型信息,所以很多 @clappski 文章明确说“Typescript 1.8 现在支持无类型的 JS 文件” 在我看来 import SomeModule from 'something'; 自 ES2015 以来是 普通 JS 语法 ...因此,如果我在 ES2015 项目中使用该导入语句,然后想迁移到 TS ,那么我必须将所有import 语句更改为require 语句(对于没有类型的库,以及我尚未迁移的代码)? ...这会很痛苦...如果是这样,那么我会声称 TS 不是 JavaScript 的 superset

以上是关于如何在 Typescript 1.8 中包含无类型节点模块?的主要内容,如果未能解决你的问题,请参考以下文章

翻译: TypeScript 1.8 Beta 发布

在 TypeScript 1.8 中实现一个简单的字典

Java 之 JDK 1.8 新增日期时间类型

typescript 1.8-13.ts

typescript 1.8-11.ts

typescript 1.8-10.ts