检查打字稿中数组的类型

问题描述 投票:0回答:1

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 
*/
typescript abstract-syntax-tree
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.