无需发出要求的打字稿智能感知

Typescript intellisense without emitting require

我的 HTML 包含这个:

<script src="js/vendor/react.js"></script>
<script src="js/vendor/react-dom.js"></script>
<script type="text/javascript" src="my-react-component.js"></script>

...我正在尝试在 Visual Studio 2015 年编写一个简单的 TSX 文件,将其转换为 my-react-component.js:

/// <reference path="../../typings/tsd.d.ts" />

class ExampleApplication extends React.Component<any, {}> {
  render() {
      return <p>{this.props.message}</p>;
  }
};

ReactDOM.render(
    <ExampleApplication message="Hello, world" />,
    document.getElementById('container')
);

我已经从 DefinitelyTyped 导入了 react.d.tsreact-dom.d.ts 并将它们包含在我的 tsd.d.ts

问题是:TypeScript 无法识别 "React" 和 "ReactDOM",除非我明确导入它们,使用:

import * as React from "react"; 
import * as ReactDOM from "react-dom";

这对于编辑 .tsx 来说效果很好(事实上,我获得了这些命名空间的完整 IntelliSense)。

但是转译后的 .js - 使用 "React" JSX 编译选项 - 包括不需要的 requires:

var React = require("react");
var ReactDOM = require("react-dom");

导致页面执行出错,因为React和ReactDOM都是react.js定义的全局名称,没有"require"函数可用

有没有一种方法可以将这些名称声明为 TypeScript,而无需为每个名称发出实际要求?

否则 - 我正在尝试做的事情有什么问题?我错过了什么?

Isn't there a way to declare those names to TypeScript, without emiting the actual require for each of them?

有。使用 global 版本的 TypeScript 定义:https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/react/react-global.d.ts

Otherwise - what is wrong in what I'm trying to do? What am I mising?

使用全局模块不是一个好主意。一旦扩展到大约 50 个文件(发生得很快),您将 运行 遇到问题 https://github.com/TypeStrong/atom-typescript/blob/master/docs/out.md