Как создать тип пересечения массивов

Упрощение того, что я пытаюсь реализовать, заключается в следующем:

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

Короче: я пытаюсь ввести функцию, которая принимает массив, который является пересечением двух других@psalm-types. То есть: в массиве есть поля из обоих типов массивов (они уникальны и гарантированно будут разными).

Этот код, как и ожидалось, не проверяет тип:

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

Неужели нет другого выхода, кроме как придерживаться утверждений / проверок во время выполнения?

Важно: этот вопрос касается только статической типизации, я понимаю, что вы можете проверить это во время выполнения.

1 ответ

Решение

Я сообщил об этом как об ошибке https://github.com/vimeo/psalm/issues/3095, и она была исправлена ​​по адресу https://github.com/vimeo/psalm/commit/09663b593895fb7e6a0ed789dfad11363999bfea

Итак, теперь он правильно проверяет типы.

Другие вопросы по тегам