使用此代码(游乐场):
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 = number,R = boolean)中推断出类的隐式类型参数。
我也想用编译器API来做同样的事情。我有program.typeChecker,我被困在这里了。如何获得隐式类型参数?
发布于 2021-02-09 16:21:33
Test类型在extends Test of M中不是隐式类型为Test<number, boolean>。类M将test的声明重写为test(q: number): boolean。如果您得到了ExpressionWithTypeArguemnts在extends Test of M中的类型,那么它将是Test<unknown, unknown>。
从M获取类型的
如果你知道Test的结构,你有.
declare class M extends Test {
test(q: number): boolean;
}...and您希望找到参数的类型和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**,发现** P 和 R in M
如果您有Test,并且希望在M中找到P和R,并且不知道Test的类型可能是什么,那么您就不能使用前面描述的方法。
要做到这一点,您必须手动遍历Test类型,然后以相同的方式遍历M,并查看Test中的类型参数在M中使用的类型。这样做有点复杂,要在这里发布太多的工作/代码。
基本上,没有一种简单的方法可以构建类型,然后与编译器API进行比较。有一些建议,使这更容易(前)。Builder方案和类型关系API提案)。
也就是说,一种方法就是通过ts.createSourceFile创建一个虚拟文件并在其中编写一些代码(例如。然后使用该文件上的类型检查器解析这些类型。
发布于 2022-10-24 11:16:26
有一个新的库将类型带到运行时世界的https://deepkit.io/中。您可以使用它推断代码中的任何类型。
它是一个完整的框架,但您可以使用@deepkit/types和@deekit/type编译器来满足您的需要。
https://stackoverflow.com/questions/66108003
复制相似问题