0

我要实现的简化如下:

<?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

真的没有办法,只能坚持运行时断言/检查吗?

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

4

1 回答 1

1

我将其报告为错误https://github.com/vimeo/psalm/issues/3095并在https://github.com/vimeo/psalm/commit/09663b593895fb7e6a0ed789dfad11363999bfea修复

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

于 2020-05-13T09:39:48.273 回答