TypeScript编译器API:获取类型结构

zaq34kh6  于 2023-11-20  发布在  TypeScript
关注(0)|答案(2)|浏览(169)

是否有一个API方法可以从TypeScript编译器中获取“bottomed out”类型信息?示例:

interface User {
  id: number
  name: string
}

type NameOnly = Pick<User, 'name'>

type NameOnlyAliased = NameOnly

字符串
在VSCode中,如果我将鼠标悬停在NameOnlyAliased上,它会显示:

type NameOnlyAliased = {
    name: string;
}


我的问题是,编译器API中是否有一个函数(或其他简单的方法,而不应用别名,Pick等的语义)来获取上面=右侧的信息,最好是作为数据(而不仅仅是字符串),比如:

{
  NameAliasedOnly: {
    properties: {
      name: {
         type: 'string'
      }
    }
  }
}


用例是生成代码以从类型定义创建fast-check仲裁器(如果已经存在,那就太棒了)。我已经尝试过使用ts-json-schema-generator来实现这一目的,但有一些类型定义它无法处理。

zsbz8rwp

zsbz8rwp1#

我找到了一个解决方案。它不直接使用TypeScript编译器API,而是使用优秀的ts-morph library,一个编译器API的 Package 器,它简化了许多任务。这里有一些示例代码,其中test.ts文件包含我上面问题中的示例代码。

import { Project, TypeFormatFlags } from 'ts-morph'

const project = new Project({
  tsConfigFilePath: 'tsconfig.json',
  skipAddingFilesFromTsConfig: true,
})
const file = 'test.ts'
project.addSourceFileAtPath(file)

const sourceFile = project.getSourceFile(file)

const typeAlias = sourceFile?.getTypeAlias('NameOnlyAliased')
if (typeAlias) {
  console.log(
    typeAlias
      .getType()
      .getProperties()
      .map(p => [
        p.getName(),
        p
          .getTypeAtLocation(typeAlias)
          .getText(
            undefined,
            TypeFormatFlags.UseAliasDefinedOutsideCurrentScope
          ),
      ])
  )
}

字符串
执行此脚本会根据需要输出[ [ 'name', 'string' ] ]。对于更复杂的类型,您可以导航到类型层次结构。

dtcbnfnu

dtcbnfnu2#

我根据@sparkofreason的答案创建了一个CLI工具ts-simplify。它是一个编译器,输出简化的基本类型。例如:

npx ts-simplify source-code.ts output-types.ts

字符串
这将输出一个具有所需输出的文件:

export type NameOnlyAliased = {
    name: string;
}

相关问题