如何创建交集类型的数组

How to create intersection type of arrays

我要实现的内容的简化如下:

<?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 个 @psalm-types 的交集。即:一个数组具有来自两种数组类型的字段(它们是唯一的并且保证不同)。

此代码符合预期 - 不进行类型检查:

ERROR: InvalidDocblock - 9:11 - Intersection types must all be objects, Psalm\Type\Atomic\ObjectLike provided in docblock for acceptFooAndBar

难道真的没有办法只能坚持runtime吗assertions/checks?

重要提示:这个问题完全是关于静态类型的,我知道你可以在运行时检查它。

我将其报告为错误 https://github.com/vimeo/psalm/issues/3095 and it was fixed at https://github.com/vimeo/psalm/commit/09663b593895fb7e6a0ed789dfad11363999bfea

所以现在它可以正确地进行类型检查。