我想创建一个以javascript形式存在的库的类型定义。
相当新的我阅读了文档on the official manual以及所有示例。
但是有一种情况我并不理解:
库为程序员提供了一个全局变量foo
,它包含类和对实例的引用,例如,可以使用(在javascript中)触发搜索
var filter = new foo.Filter();
var results = foo.search.performSearch(filter);
同样foo
也可以在window
对象中使用,因此使用window.foo.[...]
会保留相同的结果。
我怎样才能代表这个事实呢? 我最初开始定义以下内容(基本上复制了库API参考中的内容):
interface FooObject {
foo: Foo;
}
interface Window extends FooObject { }
interface Foo {
search: Search;
}
interface Search {
performSearch(): void;
}
declare const foo: Foo;
这样就接受了语法foo.search.performSearch()
,window.foo.search.performSearch()
也是如此。
能够代表第一部分new foo.Filter()
的唯一方式(我读到的)将是
declare namespace /*or module*/ foo {
class Filter {
// [...]
}
}
但是名称空间are also declared as values,所以这会覆盖第一个foo
定义并且编译器会抱怨。另外,即使它有效,我也不认为new window.foo.filter()
会按预期运行,并且肯定会抛出编译器错误。
当然我可以做以下
declare namespace /*(or module)*/ foo {
const search: Search;
interface Search {}
class Filter {}
}
没有声明const foo: Foo
或类Foo
但我无法在d.ts文件中将模块分配给window.foo
,编译器会抱怨。
另外,这不是一个允许我坚持使用库的API Doc的解决方案,该库明确告诉我上面解释的关于Window的层次结构,具有Foo类等的内容。
我如何表示这种结构?
答案 0 :(得分:1)
您通过构造函数表示一个类。
Foo