我要实现的简化如下:
<?php
/**
* @psalm-type Foo=array{foo: string}
* @psalm-type Bar=array{bar: int}
*/
/**
* @param Foo&Bar $v
*/
function acceptFooAndBar(array $v): void {
echo sprintf('%s %d', $v['foo'], $v['bar']);
}
acceptFooAndBar(['foo' => 'f', 'bar' => 42]);
https://psalm.dev/r/d08f3ea0d1
简而言之:我正在尝试键入一个函数,该函数接受一个数组,该数组是 2 other 的交集@psalm-types
。也就是说:一个数组具有两种数组类型的字段(它们是唯一的并且保证是不同的)。
此代码符合预期 - 不进行类型检查:
ERROR: InvalidDocblock - 9:11 - Intersection types must all be objects, Psalm\Type\Atomic\ObjectLike provided in docblock for acceptFooAndBar
真的没有办法,只能坚持运行时断言/检查吗?
重要提示:这个问题完全是关于静态类型的,我知道你可以在运行时检查它。