2016-12-14 88 views
0

我有一个外部JS库全局参数:如何在定义文件中定义全局TypeScript变量以便导入?

function Thing() { ... } 
... 
var thing = new Thing(); 

有一个打字稿定义文件,所以在thing.d.ts

declare var thing: ThingStatic; 
export default thing; 

export interface ThingStatic { 
    functionOnThing(): ThingFoo; 
} 

export interface ThingFoo { 
    ... and so on 

然后我导入我自己的TS文件这跟:

import thing from 'thing'; 
import {ThingFoo} from 'thing'; 
... 
const x:ThingFoo = thing.functionOnThing(); 

的问题是,transpiles到:

const thing_1 = require("thing"); 
... 
thing_1.default.functionOnThing(); 

这会引发错误。我问了一下,在another question和建议是使用:

import * as thing from 'thing'; 

这不能解决问题 - 它给了我在TS thing.default但随后这是不确定的,一旦transpiled到JS。

我认为thing.d.ts有什么问题 - 必须有一种方法来定义可导入的类型化全局参数。

我应该如何编写thing.d.ts以便正确表示JS,并且不会包含default或其他实际不存在的属性?

+0

尝试使用字符串名称声明 - '''声明var'thing'。我并不真正理解_Why_这个作品,但我必须在稍微不同的情况下做同样的事情。(在我的情况下,我从声明模块foo切换到声明模块'foo') – user1821052

回答

1

如果使用该库的唯一方式是通过访问它的全局变量(而不是将其导入为节点模块或amd或umd模块),那么最简单的方法是在顶部没有任何export s的声明文件水平。只需声明一个变量就足够了。要使用它,必须在编译打字稿代码时包含该声明文件,方法是将其添加到filesincludetsconfig.json中,或者直接在命令行上添加。您还必须在运行时在库中包含<script>标签。

实施例:thing.d.ts

declare var thing: ThingStatic; 

declare interface ThingStatic { 
    functionOnThing(): ThingFoo; 
} 

declare interface ThingFoo { 
} 

测试thing.ts

const x:ThingFoo = thing.functionOnThing(); 

可以一起

./node_modules/.bin/tsc test-thing.ts thing.d.ts 

结果被编译在test-thing.js

var x = thing.functionOnThing(); 

另请参阅this question关于环境声明。

注:有模块装载机在那里,允许使用的全局库,如果他们的模块,所以它是可以使用的,而不是<script>标签import声明,但如何配置这些模块加载器要做到这一点是另一个,更复杂题。

+0

这是行不通的。如果没有'thing.d.ts'中的'export'语句,那么'test-thing.ts'就不知道全局变量'thing'是什么。环境声明起作用,但首先破坏了具有'thing.d.ts'的所有要点,因为现在一切都只是“任何”。这个全局变量是大API的入口 - 我希望定义对TypeScript可见。 – Keith

+0

没有一切都是打字,而不是“任何” - 你为什么说“一切都是一切”?如果它真的是全局变量,则无法导入它 - 您无法导入未通过模块化JavaScript代码导出的东西。声明文件只是描述了在JavaScript库中定义的现实,它不能更改它。 – artem

+0

这就是我尝试使用这个时所得到的结果。我开始认为这可能是Visual Studio中的一个错误。我会用替代实现来做一些测试。 – Keith