typescript - 如何访问非导出命名空间中的接口?
问题描述
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。)
解决方案
可以将稍微修改的版本放入单独的类型声明文件中:
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]>;
推荐阅读
- syntax - GraphQL SDL 中的 `schema` 关键字使用
- python - Azure 功能部署失败:`上传构建内容时 SCM_RUN_FROM_PACKAGE 格式错误。`
- angular - 想要将占位符添加到动态生成的字段角度材质
- reactjs - 有没有办法在 react-map-gl 中为建筑物和房屋添加地块大小,如下图所示
- css - 将全屏 HERO 图像幻灯片添加到不同的 Shopify 页面
- javascript - 用 Electron 应用程序中的复杂状态对象反应 useState 问题
- r - 在 R 中找到第 N 个根
- c++ - 你能在 C++ (GCC) 中创建一个 8 位或 16 位的枚举器吗?
- c - libnfc - 模拟 NDEF URI - NFC
- c# - ILogger 未将 TRACE 和 DEBUG 消息写入目标