Javascript 在typescript类型定义中表示内部类
我想创建一个仅以javascript形式存在的库的类型定义 作为一名新手,我阅读了文档以及所有示例 然而,有一个案例我并不真正理解: 该库为程序员提供了一个全局变量,Javascript 在typescript类型定义中表示内部类,javascript,typescript,typescript-typings,Javascript,Typescript,Typescript Typings,我想创建一个仅以javascript形式存在的库的类型定义 作为一名新手,我阅读了文档以及所有示例 然而,有一个案例我并不真正理解: 该库为程序员提供了一个全局变量,foo,它同时包含类和实例引用,因此可以使用(javascript)触发搜索 但是,同样的foo也可以在窗口对象中使用,因此使用window.foo.[…]可以得到相同的结果 我怎样才能代表这个事实? 首先,我定义了以下内容(基本上是复制库的API引用中的内容): 这样就可以接受语法foo.search.performSearch(
foo
,它同时包含类和实例引用,因此可以使用(javascript)触发搜索
但是,同样的foo
也可以在窗口
对象中使用,因此使用window.foo.[…]
可以得到相同的结果
我怎样才能代表这个事实?
首先,我定义了以下内容(基本上是复制库的API引用中的内容):
这样就可以接受语法foo.search.performSearch()
,window.foo.search.performSearch()
要表示第一部分,new foo.Filter()
,唯一的方法是
declare namespace /*or module*/ foo {
class Filter {
// [...]
}
}
但是名称空间,所以这会覆盖第一个foo
定义,编译器会抱怨。另外,即使它能工作,我也不认为newwindow.foo.filter()
会像预期的那样运行,并且肯定会抛出编译器错误
当然,我可以这样做
declare namespace /*(or module)*/ foo {
const search: Search;
interface Search {}
class Filter {}
}
没有声明const foo:foo
或类foo
,但我无法在d.ts文件中将模块分配给window.foo
,编译器抱怨。
另外,这不是一个允许我坚持使用库的API文档的解决方案,它明确地告诉我上面解释的关于窗口层次结构的内容,有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;
太棒了,我没想到!只需补充一点:如果构造函数有参数,我相信以下几点就可以了:
Filter:new(param:type)=>Filter代码>和我,应该不需要在过滤器接口/类中声明构造函数,对吗?谢谢你的回答!哦,差点忘了:构造函数重载呢?请尝试以下重载语法:Filter:{new():Filter,new(par1?:number):Filter}代码>
declare namespace /*(or module)*/ foo {
const search: Search;
interface Search {}
class Filter {}
}
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;