У меня есть сопоставленный тип с именем 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
файлс разрешенным типом , как показано во втором фрагменте, поэтому клиентам не нужны объявления для всего дерева файлов для вывода типа. Другими словами, я хотел бы «вставить» тип, выведенный из TypeScript, заменить объявление Commands
и удалить все операторы импорта.
Я думаю, что мне нужно использовать API компилятора, но небольшую документациюЯ мог бы найти не очень ясно. Если честно, я даже не знаю с чего начать.
Как мне выполнить эту задачу ??
Я начал с создания Program
с использованием ts.createProgram()
с указанием имени файла protocol.ts
. Я посетил каждый узел оттуда, так что я знаю, что файл загружен. Я создал TypeChecker
и использовал .getTypeAtLocation()
почти для каждого Node
, ведения журнала checker.typeToString(type)
, checker.GetFullyQualifiedName(type.symbol)
и многих других, но нет следов предполагаемого типа. Может быть, проверка типов или программа должна иметь каждый загруженный файл? (Я предполагал, что он сделает это сам). Если да, то как мне создать массив из шаблона glob в tsconfig.json
?
Как видите, я немного растерялся, поэтому любая помощь иориентация приветствуется.
Заранее большое спасибо.