【发布时间】:2019-12-27 11:31:37
【问题描述】:
显然,Typescript 似乎与 AST 配合得很好。如果我检查x.type == "Abc",那么下一行,打字稿就知道x 的类型是Abc。请注意,我使用它来检查带有 JSDOC 格式类型注释的 JS 文件。但我想纯打字稿文件也是如此
但是,我在测试一组元素时遇到了问题。
第一个示例有效,因为我循环遍历每个元素,并且仅在检查类型时推送它。所以 typescript 正确推断出类型 Property[] 作为函数的返回类型
/**
* @param {ObjectExpression} objectAst
*/
function getPropertiesList(objectAst) {
let propertiesList = []
for (let p of objectAst.value.properties) {
if (p.type == "Property")
propertiesList.push(p)
else
throw new Error("Properties field has elements that aren't of type `Property`")
}
return propertiesList
}
但是,这个示例在功能上是相同的(但在我看来更干净并且不会创建新数组)不起作用。推断类型为(SpreadElement|Property|ObjectMethod|ObjectProperty|SpreadProperty)[]。所以它不考虑支票。
/**
* @param {ObjectExpression} objectAst
*/
function getPropertiesList(objectAst) {
let propertiesList = objectAst.value.properties
if (!propertiesList.every(p => p.type == "Property"))
throw new Error("Properties field has elements that aren't of type `Property`")
return propertiesList
}
谁能提供一些关于打字稿如何以不同方式处理一个案例的见解?
Typescript 可以使用检查来使特定类型更加具体(如第一个示例所示),但显然它无法对数组执行这些检查。
这可以被认为是打字稿编译器中的一个错误(因为两段代码显然应该返回相同的类型)?
编辑:为了提供一些上下文和可测试性,我从recast 导入了如下类型:
/**
* @typedef { import('recast').types.namedTypes.ObjectExpression} ObjectExpression
* @typedef { import('recast').types.namedTypes.Property} Property
*/
【问题讨论】:
标签: typescript abstract-syntax-tree