我想注释函数,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
,因为我需要保留参数中可能存在的任何其他键。
如何正确注释函数?
我使用模板 T,因为我需要保留参数中可能存在的任何其他键。
这也许就是这里需要的提示。
更具体地说,您使用
T
作为 @return 与非类型: array{} 形状的交集类型。
正如 phpstan / phpstan 数组交集支持 #4703 (github.com) 中所述,交集类型的与号
&
不会计算数组形状,同样,它也不会计算示例中的 T
模板.
根据 2024 年 2 月的ondrejmirtes,您对 PHPStan 的期望如下:
PHPStan 不会添加对“数组相交”的支持,但会使用以下语法添加对“具有已知类型的额外键的数组形状”的支持:
(与最近在 Psalm 中添加的相同)。array{a: mixed, ...<array-key, mixed>}
请关注此问题获取更新:#8438 (github.com)