使用 Redux、Typescript 在与 JS 模块不同的文件夹中键入。如何告诉它模块所在的位置?

Using Redux, Typescript Typing in different folder to the JS module. How to tell it where the module lives?

我在我的应用程序中使用 Redux。我正在使用 Visual Studio 2015 和 npm 来下载 Redux 作为依赖项。

我有以下文件夹结构:

MySolution.sln
├── node_modules
│   ├── redux
│   │   ├── index.d.ts
|   |   ├── dist
│   │   |   ├── redux.js
│   │   |   ├── redux.min.js
├── Scripts
│   ├── myscript.ts
│   ├── myscript.js

Redux 的节点结构与使用 npm 下载时的节点结构相同

npm install redux

我有一个使用 Redux 的 TypeScript 脚本 (myscript.ts),我从中导入 createStorecombineReducers

myscript.ts

/// <reference path="../node_modules/redux/index.d.ts" />
import { combineReducers, createStore } from "../node_modules/redux/index";

//... more code
const myApp = combineReducers({
    SelectedAnswers: selectedAnswers
});

var store = createStore(myApp);

编译为以下内容 (myscript.js):

define(["require", "exports", "../node_modules/redux/index"], function (require, exports, index_1) {
    "use strict";
    var _this = this;
    Object.defineProperty(exports, "__esModule", { value: true });

    var questionApp = index_1.combineReducers({
        SelectedAnswers: selectedAnswers
    });

    var store = index_1.createStore(questionApp);
});

如您所见,我的代码使用了导入脚本,这是由 Visual Studio/TypeScript 自动生成的。

这对于编译目的来说很好,因为它指向 ../../../node_modules/redux/index 这将允许它获取 index.d.ts 这是 TypeScript 类型文件(明确类型化)。

所以当应用程序实际上 运行s 时,我的问题就来了,Redux 的真正脚本在下一个文件夹中,/redux.js,所以当我 运行 我的脚本它告诉我说模块无法加载。

如何告诉 TypeScript 该脚本在 运行 时间存在于 /redux

我想,如果我在 require.config 中针对 TypeScript 生成的 define() 方法中出现的名称 htat 指定它,我可以告诉 RequireJS 脚本在哪里,但这并没有有什么影响:

require.config({
    baseUrl: "/",
    paths: {
        "../node_modules/redux/index": "../node_modules/redux/dist/redux"
    }
});

感谢您的帮助。

注意:如果我将 index.d.ts 移动到与 redux.js 相同的文件夹中并命名为 redux.d.ts,它工作正常,但这不是它在 npm 下载中的显示方式。我不想每次更新都将它们移动到同一个文件夹中。

好吧,看来我痛苦的主要原因是我混淆了内部模块和外部模块的概念。

外部模块通常不会通过它们在构成应用程序的 TypeScript 文件挂毯中的相对路径来引用,这些应该在 require.config().

中指定

可以通过相对路径引用内部模块和TypeScript文件。

所以答案是 redux,一个外部模块,应该在 TypeScript 中通过 redux 定义文件中指定的名称来引用。

import { combineReducers, createStore } = require("redux");

//... now we can use the imported external module
const myApp = combineReducers({
    SelectedAnswers: selectedAnswers
});

var store = createStore(myApp);

你还必须确保你有外部模块的类型,我没有这个,所以这导致我的 TypeScript 文件编译失败并出现错误 Cannot find module 'redux'。所以我通过安装明确类型的定义来获得类型,这允许 TypeScript 文件编译:

Install-Package react-redux.TypeScript.DefinitelyTyped

似乎这通常适用于您可能想要导入的大多数外部模块,但如果它们不是,您可以指定您自己的定义(将其放在您的 *.d.ts 文件中解决方案),这将允许您编译 TypeScript 文件:

// This can be redux, or any other module that you'd like to use in require() to enable it to compile your TypeScript code
declare module "redux" {
    var _temp: any;
    export = _temp;
}

如果这样做,您自然不会获得智能感知,因此首选 TypeScript 类型。

当谈到设置你的属性时 require.config(),它被称为你的应用程序的入口点,你应该:

  • 指定您的外部模块相对于您的 baseUrl
  • 的位置
  • 指定要解析为相对位置的内部模块

这是我的示例的入口点示例(main.ts,编译为main.js供以后使用):

require.config({
    baseUrl: "/", // The base url
    paths: {
        // Named external module (redux in this case)
        "redux": "../node_modules/redux/dist/redux"
    }
});

// Bootstrap the entry point module, notice that this is an 'internal module', hence the relative location being used as the module name
require(["Scripts/myscript"], () => {
    console.log("Your internal module has been resolved and should be running now!")
});

这可以从您的应用程序页面中调用,如下所示:

<script "/node_modules/requirejs/require.js" data-main="scripts/main.js"></script>