如何使用不含.d.ts的打字稿中的外部非打字稿库?


100

我已经在我的.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({})

但是打字稿错误说:“找不到名称'树'”

我也尝试使用test.js文件进行编译--module amd并将其放置import Tree = require("model/tree");在顶部,但它再次出错:Cannot find external module 'model/tree'.但是显然它应该是有效的导入,请参见此处定义的位置:https : //github.com/marmelab/tree .js / blob / master / src / main.js

不是想写.d.ts文件为每一个外部JavaScript文件,我想使用,是严重打字稿什么要我做什么?


1
不必编写.d.ts文件。见stackoverflow.com/questions/27273489/...为例
xmojmr

有趣的是,那仍然需要我声明对象。我的印象是Typescript与javascript完全兼容。我认为从Typescript的角度来看这是有道理的,它某种程度上需要阅读代码,如果没有很好的引用,那将会是错误。
2014年

Answers:


124

我不想为我要使用的每个外部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...

当我使用这种方法时,它在为我抱怨。我不得不使用下面的安东方法。您的里程可能有所不同!感谢您的答案basarat。
Tiz

您还可以将type指定为接口,而不是将提供更好的智能感的任何接口。
Akash Kava '18

24

您可以自己定义“ require”并使用TypeScript未记录的amd依赖功能:

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

“ amd-dependency”指令将告诉编译器包括您的模块以在生成的代码中“定义”参数: 请参见此处的示例

您也可以阅读一篇非常好的文章,其中介绍了如何将TypeScript与RequireJS一起使用。

但是请注意,如果没有为现有代码编写正确的TypeScript定义,就不会获得任何类型信息,因此您将不会获得类型安全检查,工具中的高级代码完成等。因此,您的“树”实际上将是“任何”类型,并且实际上将是其他TS代码中的动态JS代码。


使用webpack时不是一个好主意,webpack要求在编译时提供此模块...
Akash Kava
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.