我有两个文件。一个是命名类型
export type ExternalType = {
type: 'external'
}
,另一个是
import { ExternalType } from './type'
interface IA {
(): number
}
interface IB {
type: 'b'
}
interface IC extends IB {
type: 'c'
}
type AliasedType = {
type: 'aliased'
}
type Check = {
type: 'a'
funcInterface: IA
normalInterface: IB
inheritedInterface: IC
external: ExternalType
aliased: AliasedType
}
type DummyType = {
id: string
type: 'dummy'
}
我想在上面提取Check类型,指定类型名'Check',并得到输出类型形式后面跟着一个。
a)依赖关系,所有类型引用节点被替换为解析的内置typescript类型。
type Check = {
type: 'a'
funcInterface: () => number // or expression similar to Function type
normalInterface: {
type: 'b'
}
inheritedInterface: {
type: 'b'
type: 'c'
}
external: {
type: 'external'
}
aliased: {
type: 'aliased'
}
}
或
b)提取所有依赖类型并集成到一个文件
type ExternalType = {
type: 'external'
}
interface IA {
(): number
}
interface IB {
type: 'b'
}
interface IC extends IB {
type: 'c'
}
type AliasedType = {
type: 'aliased'
}
type Check = {
type: 'a'
funcInterface: IA
normalInterface: IB
inheritedInterface: IC
external: ExternalType
aliased: AliasedType
}
后面是我写的部分代码,提取了检查类型,但不解析依赖类型。
function generateCodeFromAst(ast: ts.Node) {
const resultFile = ts.createSourceFile(
'dummy.ts',
'',
ts.ScriptTarget.Latest,
/* setParentNodes */ false,
ts.ScriptKind.TS,
);
const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
const generatedCode = printer.printNode(
ts.EmitHint.Unspecified,
ast,
resultFile,
);
return generatedCode;
}
// some omitted code
// visit
if (node.name.text === symbol) {
const t = checker.getTypeAtLocation(node);
// NOTE: https://stackoverflow.com/questions/67423762/typescript-compilerapi-how-to-get-expanded-type-ast
const ast = checker.typeToTypeNode(
t,
undefined,
ts.NodeBuilderFlags.NoTruncation | ts.NodeBuilderFlags.InTypeAlias,
);
console.log(generateCodeFromAst(ast!))
输出如下
{ type: "a"; funcInterface: IA; normalInterface: IB; inheritedInterface: IC; external: ExternalType; aliased: AliasedType; }
最后,我想要将Check类型节点AST插入到另一个AST中,该AST具有以上两种解决的类型依赖关系。如果没有依赖类型,代码可以正常工作。
ts.factory.createTypeLiteralNode([
ts.factory.createPropertySignature(
undefined,
ts.factory.createIdentifier('check'),
undefined,
CheckTypeAST,
),
]),
有可能吗?
最后使用ts-morph提取所有类型和接口,实现所需类型的选取。这些代码实现了我的目标,虽然可能会导致错误,如循环依赖或复杂的泛型类型。