Typescript显然与AST搭配使用效果很好。如果我检查x.type == "Abc"
,则打字稿的下一行知道x
的类型为Abc
。请注意,我使用它来以JSDOC格式对带有类型注释的JS文件进行类型检查。但是我想纯打字稿文件也一样]
但是,我在测试一系列元素时遇到问题。
第一个示例有效,因为我遍历了每个元素,并且仅在检查类型时才推送它。因此,打字稿正确推断出类型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
*/