如何访问非导出名称空间中的接口?

时间:2020-01-20 20:33:54

标签: typescript

type definition for 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。)

1 个答案:

答案 0 :(得分:0)

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

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]>;