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

Blu*_*lub 93 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>
Run Code Online (Sandbox Code Playgroud)

然后在test.js中:

 var myTree = Tree.tree({})
Run Code Online (Sandbox Code Playgroud)

但是打字稿错误地说:"找不到名字'树'"

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

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

bas*_*rat 119

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

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

declare var Tree:any; // Magic
var myTree = Tree.tree({})
Run Code Online (Sandbox Code Playgroud)

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...
Run Code Online (Sandbox Code Playgroud)

  • 嗯,这似乎不适用于进口 (6认同)

小智 23

您可以自己定义'require'并使用TypeScript的未记录的amd依赖特性:

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

'amd-dependency'指令将告诉编译器将您的模块包含在生成代码中的"define"参数中: 请参阅此处的示例.

您还可以查看一篇非常好的文章,该文章解释了如何将TypeScript与RequireJS一起使用.

但请注意,如果不为现有代码编写正确的TypeScript定义,则不会提供任何类型信息,因此您不会获得类型安全检查,工具中的高级代码完成等.所以,你的'Tree'实际上是'any'类型,实际上它将是其他TS代码中的动态JS片段.