如何在没有.d.ts的情况下使用typescript的外部非打字稿库?

时间:2014-12-11 07:02:30

标签: requirejs typescript

我已在我的.html文件中定义了这些:

<script type="text/javascript" src="bower_components/tree.js/tree.min.js"></script>
<script type="text/javascript" src="bower_components/q/q.js"></script>
<script type="text/javascript" src="test.js"></script>

然后在test.js:

 var myTree = Tree.tree({})

但是Typescript错误地说:“找不到名字'树'”

我还尝试使用--module amd进行编译,并将import Tree = require("model/tree");放在test.js文件的顶部,但它再次出现错误:Cannot find external module 'model/tree'.但显然它应该是有效的导入,看这里定义的地方:https://github.com/marmelab/tree.js/blob/master/src/main.js

想为我想要使用的每个外部javascript文件编写.d.ts文件,那严重是那些打字稿要我做的吗?

2 个答案:

答案 0 :(得分:114)

  

我不想为我想要使用的每个外部javascript文件编写.d.ts文件,那是严格意义上的Typescript要我做的吗?

没有。最简单/最快的解决方案就是告诉它那里有一些变量Tree。这很简单:

declare var Tree:any; // Magic
var myTree = Tree.tree({})

TypeSafety是TypeScript中的滑动缩放。在这种情况下,您只是告诉编译器有一些名为Tree的东西,您将管理并且除了它存在之外,不会关心很多类型的安全。

更多

恕我直言:行declare var Tree:any;比其他JS定义工具更简单,您可以编写声明使用代码中不存在的变量。

更新

interface ITree {
    .. further methods and properties...
}

interface ITreeFactory {
    tree(input: { [key: string]: any }): Itree
};

declare var Tree: ITreeFactory; // magic...

答案 1 :(得分:21)

您可以定义&#39;要求&#39;您自己并使用TypeScript的未记录的amd依赖功能:

/// <amd-dependency path="model/tree" />
declare var require:(moduleId:string) => any;
var Tree = require("model/tree");

&#39; AMD-依赖性&#39;指令将告诉编译器将您的模块包含在&#34; define&#34;生成代码中的参数: see a sample here

您还可以查看a very good article,其中介绍了如何将TypeScript与RequireJS一起使用。

但请注意,如果没有为现有代码编写正确的TypeScript定义,您将无法获得任何类型信息,因此您无法获得类型安全检查,工具中的高级代码完成等等。所以,你的树&#39;实际上它将是&#39; any&#39;,实际上将是其他TS代码中的动态JS片段。