Javascript 在typescript类型定义中表示内部类

Javascript 在typescript类型定义中表示内部类,javascript,typescript,typescript-typings,Javascript,Typescript,Typescript Typings,我想创建一个仅以javascript形式存在的库的类型定义 作为一名新手,我阅读了文档以及所有示例 然而,有一个案例我并不真正理解: 该库为程序员提供了一个全局变量,foo,它同时包含类和实例引用,因此可以使用(javascript)触发搜索 但是,同样的foo也可以在窗口对象中使用,因此使用window.foo.[…]可以得到相同的结果 我怎样才能代表这个事实? 首先,我定义了以下内容(基本上是复制库的API引用中的内容): 这样就可以接受语法foo.search.performSearch(

我想创建一个仅以javascript形式存在的库的类型定义

作为一名新手,我阅读了文档以及所有示例

然而,有一个案例我并不真正理解:

该库为程序员提供了一个全局变量,
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;