如何在PHPStan中正确标注含指定键的数组处理函数?
解决PHPStan中数组类型扩展的类型标注问题
你的问题出在PHPStan对数组类型交集的解析限制上,在严格模式下T&array{x: int}这种写法无法被正确解析。要实现保留原数组所有键并新增指定键的类型标注,有两种可行方案:
方案一:使用数组展开语法(推荐)
利用PHPStan支持的...T语法,展开模板类型的所有键并新增指定键,这种写法更直观且符合类型系统逻辑:
/** * @template T of array{a: string} * @param T $p * @return array{...T, x: int} */ function addXToArray(array $p) { $p['x'] = strlen($p['a']); return $p; } $result = addXToArray(['a' => 'hello']);
array{...T, x: int}表示返回的数组包含模板类型T的所有键,同时强制新增x: int键,完美保留原数组的额外键信息。
方案二:调整模板与交集顺序
如果你的PHPStan版本不支持数组展开语法,可以通过调整交集类型的顺序并修改模板约束来解决:
/** * @template T of array * @param array{a: string} & T $p * @return array{a: string, x: int} & T */ function addXToArray(array $p) { $p['x'] = strlen($p['a']); return $p; }
这里将模板T约束为任意数组,参数类型限定为必须包含a: string的T数组,返回类型则是包含a: string和x: int的T数组,同样能保留原数组的额外键。
两种方案都能让PHPStan在等级10及开启"Treat PHPDoc types as certain"的严格模式下正常解析,不会再出现"unresolvable type"错误。
内容的提问来源于stack exchange,提问作者Roman Hocke
相关产品推荐
相关产品推荐

