gpt4 book ai didi

typescript 编译器 API : Generate the full properties arborescence of a Type Identifier

转载 作者:行者123 更新时间:2023-12-05 05:05:56 26 4
gpt4 key购买 nike

给定一个类型标识符,我正在寻找一种方法来生成对象类型 AST 的完整树状结构。例如,如果我有:

File1.ts

type Content = {
title: string,
image: string,
dims: number[]
}

File2.ts

type BlogPost = Pick<Content, 'title'|'image'>

type User {
name: string,
email: string,
news: BlogPost[]
}

File3.ts

const test: User = { ... };

我的代码必须能够从用户标识符中推断出如下列表:

name
email
news.title
news.image

我通过使用 checker.getTypeAtLocation 试验了几件事,一个一个地遍历每个属性,找到正确的符号,并尝试推断属性的名称。

但我认为(希望)这种方法太多了,无法完成如此简单的事情,因为除了对象类型之外,我还必须处理属性类型的所有可能性:Picks、Excludes、Array、Omit、KeyOf、. ..

我想要的只是一个类型的最终完整形式的属性列表。

所以我的问题是:

Typescript Compiler API 是否提供工具来帮助我完成任务?例如,给定这样一个类型:

type Content = { title: string, id: number }
type Hello = Pick< Content, 'id' >

像这样生成最终且完整的 AST:

type Hello = {
id: number
}

谢谢你的帮助

最佳答案

All I want is the list of properties of the final complete form of a type.

这是一个完整的示例,展示了如何做到这一点:

// setup
import { Project, ts } from "@ts-morph/bootstrap";

const project = new Project();
const file = project.createSourceFile("./main.ts",
`type Content = { title: string, id: number }; type Hello = Pick< Content, 'id' >`);
const typeChecker = project.createProgram().getTypeChecker();

// get type alias
const helloTypeAliasDec = file.statements.find(s => ts.isTypeAliasDeclaration(s)
&& s.name.getText(file) === "Hello")!;

// get the type alias' type
const type = typeChecker.getTypeAtLocation(helloTypeAliasDec);

// now loop over all its properties
for (const property of type.getProperties()) {
const propertyType = typeChecker.getTypeOfSymbolAtLocation(property, helloTypeAliasDec);
console.log("Name:", property.name, "Type:", typeChecker.typeToString(propertyType));
}

输出:名称:id 类型:数字

根据这些信息,您应该能够构建 AST,但您可能会遇到一些边缘情况。

关于 typescript 编译器 API : Generate the full properties arborescence of a Type Identifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60249275/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com