打字稿amd模块如何工作以及为什么我会一直收到错误

时间:2016-09-09 08:57:10

标签: typescript requirejs amd

前一个是this one。目前的一个是Overview/reachbz.ts(3,28): error TS2306: File 'typings/immutable-3.8.1.d.ts' is not a module.

有人可以向我解释amd模块在打字稿中的工作原理吗?在阅读打字稿页面上的信息后,我仍然无法弄清楚它是如何工作的以及出了什么问题。

我有一个git repo来重现错误:

 git clone https://github.com/amsterdamharu/typescriptHorrors.git

` 按照要求;这是文件:

///<reference path="../typings/immutable-3.8.1.d.ts" />
import Immutable = require("typings/immutable-3.8.1");//error here
console.log("Immutable:",Immutable);

/typings/immutable-3.8.1.d.ts这里:https://github.com/facebook/immutable-js/blob/master/type-definitions/Immutable.d.ts

tsconfig.json:

{
    "compilerOptions": {
        "target": "es5",
        "watch": false,
        "module": "amd",
        "removeComments": true,
        "sourceMap": false,
        "outDir": ".",
        "rootDir": "."
    }
}

task.json(对于vscode)

{
    "version": "0.1.0",
    "command": "tsc.cmd",
    "isShellCommand": true,
    "showOutput": "always",
    "problemMatcher": "$tsc"
}

这是在Windows机器上运行但在linux上尝试使用相同的错误。使用tsc节点:

[me@localhost ts]$ tsc
Overview/reachbz.ts(4,28): error TS2306: File 'typings/immutable-3.8.1.d.ts' is not a module.

代码编译并使用requirejs但错误阻止我发布它。

这是另一件我不太懂的事情。打字稿应该是可选的侵入式,但它会将应该警告的内容(在编译后生成有效的脚本)升级为错误,因此在Visual Studio中您无法发布项目。

[UPDATE]

使用以下命令更改定义文件的内容:

export var whatever

使错误消失。

但是以下内容会导致错误回复

declare module Immutable {}

declare module "immutable" {
  export = Immutable
}

有没有人可以编译git repo?它使用原始的不可变git repo定义文件但我无法使用它来使用node tsc Version 1.8.10

2 个答案:

答案 0 :(得分:2)

在您的代码中:

import Immutable = require("typings/immutable-3.8.1");//error here

绝对不是否

首先:您不需要下载immutable的任何类型定义。他们带有不可变的js。

其次:您不是require TypeScript 定义。您实际上需要实际运行时事物。在您的情况下,immutable import Immutable = require('immutable')为{{1}}。

更多

环境定义旨在匹配 javascript运行时导入。因此,您将打字稿定义放入编译上下文中(例如,使用tsconfig.json),然后只编写JavaScript。更多:https://basarat.gitbooks.io/typescript/content/docs/project/modules.html

答案 1 :(得分:0)

我猜基于定义文件的内容,typescript使用不同的规则来解析你传递给要求的字符串。在这种情况下,因为定义有:

declare module "immutable" {
  export = Immutable;
}

我需要使用字符串&#34; immutable&#34;而name of the definition file并不重要。

将定义文件更改为:

declare module "reverseEngineerInsteadOfDocumented" {
  export = Immutable;
}

将更改传递给require的字符串更改为:

import Immutable = require("reverseEngineerInsteadOfDocumented");