Упрощение того, что я пытаюсь реализовать, заключается в следующем:
<?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
Короче говоря: я пытаюсь type функция, которая принимает массив, который является пересечением 2 других @psalm-types
. То есть: массив имеет поля из обоих типов массива (они уникальны и гарантированно будут разными).
Этот код, как и ожидалось, не проверяет тип:
ERROR: InvalidDocblock - 9:11 - Intersection types must all be objects, Psalm\Type\Atomic\ObjectLike provided in docblock for acceptFooAndBar
Есть ли неужели нет другого пути, кроме как придерживаться утверждений / проверок во время выполнения?
Важно : этот вопрос строго относится к типизации c, я так понимаю, вы можете проверить это во время выполнения.