【发布时间】:2019-11-04 18:30:31
【问题描述】:
我在文件中有一个名为 Commands 的映射类型,如下所示:
// File: protocol.ts
import { CArgs, CRes } from '../utils';
type S = import('src/applications').Services;
export type Commands = {
-readonly [P in keyof S]: {
args: CArgs<S[P]>;
res: CRes<S[P]>;
};
};
// ... more declarations
推理非常复杂,Services 本身就是一个映射类型,它使用 UnionToIntersection 和更多奇特的东西来推断,类型来自许多不同的文件... TypeScript 是这样的:
type Commands = {
Com1: {
args: number;
res: void;
};
Com2: {
args: {foo: string};
res: string[];
};
// ... etc ...
};
现在我想发出一个具有已解析类型的.d.ts文件,如第二个sn-p所示,因此客户端不需要声明整个文件树即可推断方式。换句话说,我想“粘贴”从 TypeScript 推断的类型,替换 Commands 声明并删除所有导入语句。
我想我需要使用编译器 API,但我能找到的小文档不是很清楚。老实说,我什至不知道从哪里开始。
如何执行该任务?
我首先使用ts.createProgram() 创建一个Program,并给出文件名protocol.ts。我从那里访问了每个节点,所以我知道文件已加载。我创建了一个TypeChecker,并为几乎每个Node、记录checker.typeToString(type)、checker.GetFullyQualifiedName(type.symbol) 等使用了.getTypeAtLocation(),但没有任何推断类型的痕迹。也许类型检查器或程序需要加载每个文件? (我想它会自己做)如果是这样,我如何从tsconfig.json 中的全局模式创建数组?
如您所见,我有点迷茫,因此欢迎任何帮助和指导。
非常感谢您。
【问题讨论】:
-
老问题,但您有没有找到可靠的解决方案?我有完全相同的问题。以下适用于一些示例,但就像 vscode 一样,对较大的示例进行截断并扩展联合。我可以在这个答案中添加一些类似的技巧,但是对于
dayjs等stackoverflow.com/a/57683652/1057157 -
@erich2k8 不,不是。最后,我只是为这个特定的项目提出了这个想法。我仍然很好奇如何正确解决它,但似乎不是很简单。
标签: typescript typescript-compiler-api