gpt4 book ai didi

Typescript 使用 Compiler API 推断类型参数

转载 作者:行者123 更新时间:2023-12-04 03:40:34 32 4
gpt4 key购买 nike

使用此代码( playground ):

declare class Test<P = unknown, R = unknown> {
test(p: P): R;
}

declare class M extends Test {
test(q: number): boolean;
}

// these lines are not in real code. This is an example of what TS
// could infer from my code and what I would like to find using Compiler API
type Sgn<M> = M extends Test<infer P, infer R> ? [P, R] : never;
type sgn = Sgn<M>; // [number, boolean]
typescript 可以推断类 M 的隐式类型参数( P = number , R = boolean ) 来自方法 test在类声明中。
我想用 Compiler API 做同样的事情.我有 program.typeChecker我被困在这里。我如何获得隐式类型参数?

最佳答案

型号Testextends TestM未隐式输入为 Test<number, boolean> .类(class)M覆盖 test 的声明成为 test(q: number): boolean .如果你得到 ExpressionWithTypeArguemnts 的类型在 extends TestM它将是 Test<unknown, unknown> .
M 获取类型
如果你知道Test的结构是什么是,你有...

declare class M extends Test {
test(q: number): boolean;
}
...并且你想找到参数的类型和 test的返回类型,那么您可以执行以下操作:
const mDecl = sourceFile.statements.find(child =>
ts.isClassDeclaration(child) && child.name?.escapedText === "M"
)! as ts.ClassDeclaration;
const testMethod = mDecl.members.find(member =>
ts.isMethodDeclaration(member)
&& ts.isIdentifier(member.name)
&& member.name.escapedText === "test"
)! as ts.MethodDeclaration;

// number type
typeChecker.getTypeAtLocation(testMethod.parameters[0]);
// boolean type
typeChecker.getReturnTypeOfSignature(typeChecker.getSignatureFromDeclaration(testMethod));
给定 Test , 发现 PRM
如果您有 Test并想找 PRM而你不知道 Test 的类型是什么可能看起来像,那么您不能使用前面描述的方法。
为此,您必须遍历 Test 的类型。手动然后遍历 M以同样的方式查看 Test中的类型参数是什么类型的用于 M .这样做有点复杂,在这里发布的工作/代码太多。
基本上,没有简单的方法来构建类型,然后与编译器 API 进行比较。有一些建议可以使这更容易(例如 Type Builder API ProposalType Relationship API Proposal )。
也就是说,一种解决方法是通过 ts.createSourceFile 创建一个虚拟文件。并在其中编写一些代码(例如您的 Sgnsgn 声明),然后使用该文件上的类型检查器来解析类型。

关于Typescript 使用 Compiler API 推断类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66108003/

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