typescript - Typescript 使用 Compiler API 推断类型参数
问题描述
使用此代码(操场):
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
,我被困在这里。我怎么能得到隐式类型参数?
解决方案
Test
inextends Test
的类型M
不是隐式类型为Test<number, boolean>
. 该类M
覆盖了test
to be的声明test(q: number): boolean
。如果你得到它的类型,ExpressionWithTypeArguemnts
它将是.extends Test
M
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
发现P
和R
M
如果您有Test
并且想要查找P
and R
inM
并且您不知道类型Test
可能是什么样子,那么您不能使用前面描述的方法。
为此,您将不得不Test
手动遍历类型,然后M
以相同的方式遍历并查看类型参数中Test
使用的类型M
。这样做有点复杂,在这里发布的工作/代码太多。
基本上,没有简单的方法来构建类型,然后与编译器 API 进行比较。有一些建议可以使这更容易(例如Type Builder API Proposal和Type Relationship API Proposal)。
也就是说,解决它的一种方法是通过创建一个虚拟文件ts.createSourceFile
并在其中编写一些代码(例如您的Sgn
和sgn
声明),然后使用该文件上的类型检查器来解析类型。
推荐阅读
- javascript - Scrapfly 服务不会将值替换为输入字段
- c++ - 如何通过 C++ 手动构造 Napi::CallbackInfo 对象?
- artifactory - 使用 Docker compose 安装 Xray 并使用 Jfrog Artifcatory 进行配置
- python - 防止此代码中 I 和 V 的重复跟踪?
- docker - Docker绕过防火墙规则
- flutter - 如何像flutter中的浏览器一样动态生成tab和page?
- azure - azure 门户订阅过滤器跳转到设置
- php - 向不同的类函数提交不同的表单
- java - 覆盖滑动拼图问题的哈希码函数
- javascript - 在 jQuery 每个变量中保存总和以用于范围