首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Compiler推断类型参数

用Compiler推断类型参数
EN

Stack Overflow用户
提问于 2021-02-08 19:22:53
回答 2查看 310关注 0票数 5

使用此代码(游乐场):

代码语言:javascript
复制
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]

类型标可以从类声明中的方法M (P = numberR = boolean)中推断出类的隐式类型参数。

我也想用编译器API来做同样的事情。我有program.typeChecker,我被困在这里了。如何获得隐式类型参数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-09 16:21:33

Test类型在extends Test of M中不是隐式类型为Test<number, boolean>。类Mtest的声明重写为test(q: number): boolean。如果您得到了ExpressionWithTypeArguemntsextends Test of M中的类型,那么它将是Test<unknown, unknown>

M获取类型的

如果你知道Test的结构,你有.

代码语言:javascript
复制
declare class M extends Test {
    test(q: number): boolean;
}

...and您希望找到参数的类型和test的返回类型,然后可以执行以下操作:

代码语言:javascript
复制
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**,发现** P R in M

如果您有Test,并且希望在M中找到PR,并且不知道Test的类型可能是什么,那么您就不能使用前面描述的方法。

要做到这一点,您必须手动遍历Test类型,然后以相同的方式遍历M,并查看Test中的类型参数在M中使用的类型。这样做有点复杂,要在这里发布太多的工作/代码。

基本上,没有一种简单的方法可以构建类型,然后与编译器API进行比较。有一些建议,使这更容易(前)。Builder方案类型关系API提案)。

也就是说,一种方法就是通过ts.createSourceFile创建一个虚拟文件并在其中编写一些代码(例如。然后使用该文件上的类型检查器解析这些类型。

票数 3
EN

Stack Overflow用户

发布于 2022-10-24 11:16:26

有一个新的库将类型带到运行时世界的https://deepkit.io/中。您可以使用它推断代码中的任何类型。

它是一个完整的框架,但您可以使用@deepkit/types和@deekit/type编译器来满足您的需要。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66108003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档