我想创建一个仅以 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 文档的解决方案,该文档明确说明了我在上面解释的有关 Window 层次结构、具有 Foo 类等的内容。
如何表示这个结构?
最佳答案
您通过其构造函数表示一个类。
interface FooObject {
foo: Foo;
}
interface Window extends FooObject { }
interface Foo {
search: Search;
Filter: new () => Filter;
}
interface Filter {
}
interface Search {
performSearch(filter: Filter): void;
}
declare const foo: Foo;
关于javascript - 在 typescript 类型定义中表示内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45082505/