【问题标题】:Typescript intellisense without emitting require打字稿智能感知而不发出要求
【发布时间】:2016-04-28 10:25:04
【问题描述】:

我的 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 编译选项 - 包含不需要的需要

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

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

有没有办法向 TypeScript 声明这些名称,而无需为每个名称发出实际的需求?

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

【问题讨论】:

    标签: reactjs typescript visual-studio-2015 intellisense react-jsx


    【解决方案1】:

    有没有办法向 TypeScript 声明这些名称,而不需要为每个名称发出实际的需求?

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

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

    使用 全局模块 是个坏主意。一旦扩展到大约 50 个文件(发生得非常快)https://github.com/TypeStrong/atom-typescript/blob/master/docs/out.md

    ,您就会遇到问题

    【讨论】:

    • 非常感谢@basarat!那解决了它。关于全局模块是一个坏主意,你是绝对正确的。但是,我目前正在评估 VS 2015 / TypeScript / TSX 生态系统,并希望确保该工具能够处理某些常见场景。再次感谢。
    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2013-12-25
    • 2019-12-11
    • 2017-08-03
    • 2017-06-28
    • 2014-03-22
    相关资源
    最近更新 更多