代码之家  ›  专栏  ›  技术社区  ›  Roman Hocke

在PHPstan中指定数组形状的键

  •  1
  • Roman Hocke  · 技术社区  · 4 月前

    我想注释函数,tat接受至少有键的数组 "a" 并使用新添加的键返回相同的数组形状 "x" .我试着用这样的交集类型:

    /**
     * @template T of array{a: string}
     * @param T $p
     * @return T&array{x: int}
     */
    function addXToArray(array $p) {
        $p['x'] = strlen($p['a']);
        return $p;
    }
    
    $result = addXToArray(['a' => 'hello']);
    

    这显然不是正确的方式,因为PHPstan抱怨(在第10级,“将PHPDoc类型视为确定”):

    PHPDoc tag @return contains unresolvable type.
    

    我使用模板 T 因为我需要保留论证中可能存在的任何其他密钥。

    如何正确注释函数?

    1 回复  |  直到 4 月前
        1
  •  1
  •   hakre    4 月前

    我使用模板T是因为我需要保留参数中可能存在的任何其他键。

    这也许就是这里需要的暗示。

    更具体地说,您正在使用 T 作为@return与非类型的东西的交集类型:array{}形状。

    正如前文所述 phpstan / phpstan Array intersection support #4703 (github.com) 与号 & 交集类型不计算数组形状,同样也不计算 T 示例中的模板。

    根据以下内容,您对PHPTan的期望是什么 软骨瘤 2024年2月的情况如下:

    PHPTan不会添加对“数组交集”的支持,但会使用以下语法添加对“具有已知类型的额外键的数组形状”的支持: array{a: mixed, ...<array-key, mixed>} (与最近在诗篇中添加的内容相同)。

    请关注此问题以获取更新: #8438 (github.com)