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。)
答案 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]>;