Intellij idea 如何导入jquery';Typescript 1.0中的定义文件?

Intellij idea 如何导入jquery';Typescript 1.0中的定义文件?,intellij-idea,typescript,Intellij Idea,Typescript,我在网上搜索过,但找不到任何有用的东西,大多数文章都过时了 我所要做的就是将jQuery的定义文件包含在另一个typescript文件中 我在Intellij IDEA Ultimate 13.1中工作。代码如下: Foo.ts import jquery = require("./jquery"); ///<reference path="./lib/jquery.d.ts" /> import Pony = require("ts/lib/Pony"); import $ =

我在网上搜索过,但找不到任何有用的东西,大多数文章都过时了

我所要做的就是将jQuery的定义文件包含在另一个typescript文件中

我在Intellij IDEA Ultimate 13.1中工作。代码如下:

Foo.ts

import jquery = require("./jquery");
///<reference path="./lib/jquery.d.ts" />
import Pony = require("ts/lib/Pony");
import $ = require("jquery");
class Main {

    public main(args:string[]):void {
        $(document).ready(function() {
            console.log("helloo!");
            var pony:Pony = new Pony("bobb");
            var pony2:Pony = new Pony("Anthony");
            pony.bite();
            pony2.bite();
        });
    }

}

export = Main;
我的
jquery.d.ts
Foo.ts

编译时得到的输出是:

/opt/local/bin/tsc --sourcemap --module amd Foo.ts
/.../Foo.ts(1,1): error TS2071: Unable to resolve external module '"./jquery"'.
/.../Foo.ts(1,1): error TS2072: Module cannot be aliased to a non-module type.
它与它是一个定义文件有关。导入普通ts文件可以正常工作。我试着使用找到的建议,但从那时起语法发生了变化


非常感谢您的帮助。

需要以不同方式引用声明文件

首先,包括对声明文件的引用。编译器将对其进行解析,并知道名为
jquery
1的模块存在,但它将通过其他方式在运行时可用

///<reference path="./jquery.d.ts" />
当编译器解析这一行时,它将尝试生成加载该模块所需的代码。它将查阅其已知模块列表,在其中查找
jquery
,并从声明文件中加载模块的详细信息以进行类型检查

生成的加载代码与普通模块的加载代码相同,
require.js
负责将模块名称转换为正确的文件名。如果模块名称与其文件名不匹配(或文件位于另一个目录中),则必须:

}))


在这里,我假设您的声明文件是来自DefinitelyTyped的,其中导出的模块称为
jquery
。如果是不同的文件,则导出的模块名称可能不同



旁注:我已经在IntelliJ和Visual Studio Express中编写了Typescript代码,我认为后者会轻而易举地获胜,IntelliJ在TS上有一些奇怪的行为。如果你在Windows上,我建议你尝试VS,但这似乎不是一个选项。

好的,几小时之后,我终于想出了我想要做的事情

这就是我“优雅地”导入普通
.ts
.d.ts
文件的方式

我想说的是,这些页面对我的搜索有很大帮助:

我正在使用Intellij IDEA Ultimate 13.1.4和TypeScript 1.0.0

Intellij中我的文件监视程序参数是
--sourcemap--module amd$FileName$

我所学到的(希望这能帮助其他刚刚起步的人):

好的,那么您需要javascript和ts文件来使像jQuery这样的库工作(即.d.ts文件)

下面我发布的ts文件是逐字记录的。例如,在Pony.ts中,顶部没有参考标记,这是有意的

我的目录布局是:

..\
   Website\
          \js
             jquery.js
             jquery-ui.min.js
             require.js
          \ts
             \lib
                 Animal.ts
                 Pony.ts
                 collections.ts <--- from: https://github.com/basarat/typescript-collections
                 jquery.d.ts     <-----
                 jqueryui.d.ts   <---- |--- from DefinatelyTyped: https://github.com/borisyankov/DefinitelyTyped
                 require.d.ts    <-----
              Main.ts
              Config.ts
           \css
                ...
           ...
           Index.html
Config.ts

import jquery = require("./jquery");
///<reference path="./lib/jquery.d.ts" />
import Pony = require("ts/lib/Pony");
import $ = require("jquery");
class Main {

    public main(args:string[]):void {
        $(document).ready(function() {
            console.log("helloo!");
            var pony:Pony = new Pony("bobb");
            var pony2:Pony = new Pony("Anthony");
            pony.bite();
            pony2.bite();
        });
    }

}

export = Main;
Animal.ts

import jquery = require("./jquery");
///<reference path="./lib/jquery.d.ts" />
import Pony = require("ts/lib/Pony");
import $ = require("jquery");
class Main {

    public main(args:string[]):void {
        $(document).ready(function() {
            console.log("helloo!");
            var pony:Pony = new Pony("bobb");
            var pony2:Pony = new Pony("Anthony");
            pony.bite();
            pony2.bite();
        });
    }

}

export = Main;

正如所提供的第一个链接所述,您需要在文件的底部有
export=ClassName
。我尝试过导出类名…,但没有成功。

谢谢您的帮助!我这样做了,但现在浏览器控制台出现
GET
uncaught脚本错误。我认为它在抱怨找不到jquery.js。有什么想法吗?只有这么多信息很难说。实际的错误是什么,您能在网络选项卡中看到jquery.js的请求并检查它是否得到正确的响应吗?我正在查看javascript控制台。我通过下载jQuery的javascript文件(这真的有必要吗?)并将其与Foo一起放入目录,称之为dir,使其工作。现在这部分已经解决了,有没有办法将jquery文件移动到另一个目录,如
lib
?我试着这样做并更改
文件加载的问题更多地与您正在使用的脚本加载程序(最有可能是RequireJS)有关,而不是与TypeScript本身有关。我更新了答案,看看是否有帮助。我正在使用RequireJS,但添加require config不会改变任何东西,它仍然在Foo所在的目录中查找jquery.js文件。
import Animal = require("Animal");

class Pony extends Animal {
    bite() {
        alert("II, " + this.name + " have bitten you!");
    }
}

export = Pony;
class Animal {
    name:string;
    constructor(name:string) {
        this.name = name;
        console.log("animal");
    }
}

export = Animal;