在 PHPstan 中指定数组形状的键

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

我想注释函数,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
,因为我需要保留参数中可能存在的任何其他键。

如何正确注释函数?

php phpstan intersection-types
1个回答
0
投票

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

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

更具体地说,您使用

T
作为 @return 与非类型: array{} 形状的交集类型。

正如 phpstan / phpstan 数组交集支持 #4703 (github.com) 中所述,交集类型的与号

&
不会计算数组形状,同样,它也不会计算示例中的
T
模板.

根据 2024 年 2 月的ondrejmirtes,您对 PHPStan 的期望如下:

PHPStan 不会添加对“数组相交”的支持,但会使用以下语法添加对“具有已知类型的额外键的数组形状”的支持:

array{a: mixed, ...<array-key, mixed>}
(与最近在 Psalm 中添加的相同)。

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

© www.soinside.com 2019 - 2024. All rights reserved.