Extract type使用typescript编译器api解析类型引用依赖



我有两个文件。一个是命名类型

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提取所有类型和接口,实现所需类型的选取。这些代码实现了我的目标,虽然可能会导致错误,如循环依赖或复杂的泛型类型。

相关内容

  • 没有找到相关文章

最新更新