首页 > 解决方案 > 如何访问非导出命名空间中的接口?

问题描述

Traverson的类型定义如下所示:

declare var traverson: Traverson.TraversonMethods;

export = traverson;

declare namespace Traverson {

    interface TraversonMethods {
        from(uri: string): Builder;
    }

    interface Builder {
        getResource(callback: (err: any, document: any, traversal?: Traversal) => void): InAction;
        // many more methods
    }

    interface InAction { /* doesn't matter here */}
    interface Traversal { /* doesn't matter here */}
}

只要我使用匿名函数作为getResource(). 但是,我想使用一个命名函数并想正确定义它的签名。因此我需要掌握Traversal接口——它没有被导出。

我可以通过以下方式解决它:

import traverson from 'traverson';
export type Builder = ReturnType<typeof traverson.from>;
let b: Builder; // only used in next line
export type Traversal = NonNullable<Parameters<Parameters<typeof b.getResource>[0]>[2]>;

虽然这似乎可行,但我不喜欢第三行 - 声明一个变量,一些进入转译的 Javascript 代码的东西,只是为了获得一个类型声明感觉不好。

有没有更好的方法让Traversal我的代码可以访问界面?(当然,除了为该 typedef 的来源打开一个 PR。)

标签: typescript

解决方案


可以将稍微修改的版本放入单独的类型声明文件中:

import traverson from 'traverson';

export type Builder = ReturnType<typeof traverson.from>;
declare let b: Builder;
export type Traversal = NonNullable<Parameters<Parameters<typeof b.getResource>[0]>[2]>;

推荐阅读