javascript - 在 typescript 类型定义中表示内部类

标签 javascript typescript typescript-typings

我想创建一个仅以 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/

相关文章:

angular - 从 "angularfire2/database"导入 { AngularFireDatabase, FirebaseListObservable } ;

javascript - React HOC 和 TypeScript 3.2

javascript - 将 localStorage 包装在 Angular2 服务中?

typescript - 找不到第三方模块的声明文件 - 如何声明和解决这些错误

javascript - Typescript 通用方法装饰器返回 Promise 作为值

javascript - 如何将图像加载到 HTML Canvas

javascript - 如何将div放在 Canvas 上

javascript - 如何在服务器端呈现时禁用或阻止 ReactJS 查找文档?

javascript - 是的,使用正则表达式进行验证并且不区分大小写

javascript - Typescript Dynamics CRM window.parent