Псалом, возможно, нулевое значение, предоставленное с помощью request-> get()

У меня такой код:

$request->headers->get('Accept-Language', 'en');

Я предоставляю значение по умолчанию, но Псалом считает его потенциально нулевым, поскольку ->get() объявляет, что возвращает строку, допускающую значение NULL:

// vendor/symfony/http-foundation/HeaderBag.php
/**
 * Returns a header value by name.
 *
 * @return string|null The first header value or default value
 */
public function get(string $key, string $default = null) { /* */ }

Как я могу исправить это, чтобы Псалом знал, что он не нулевой?

2 ответа

Поскольку вы не можете управлять аннотациями в вышестоящей библиотеке, вам придется предоставить Psalm недостающую информацию в своем собственном коде.

Есть несколько способов сделать это:

Преобразование в строку, поэтому Псалом не сомневается, какой тип get() получает вас:

       $a = (string) $request->headers->get('Accept-Language', 'en');

Да, приведение излишне, но ясно и лаконично. Я обычно делаю это из соображений экономии.

Вы можете явно объявить, что переменная, являющаяся результатом этого get() вызов - это строка:

       /** @var string $acceptLanguage **/
$acceptLanguage = $request->headers->get('Accept-Language', 'en');

Наконец, вы можете просто подавить PossiblyNullArgument где вам это нужно:

       /** @psalm-suppress PossiblyNullArgument */
iWantAString($request->headers->get('Accept-Language', 'en'));

Все эти работы можно посмотреть здесь.

Вы также можете комбинировать некоторые из вышеперечисленных с вашим собственным методом-оболочкой для получения значений из запроса, всегда возвращая строку. Если вы это сделаете, вам, вероятно, следует throw исключение, если параметр не найден.

В дополнение к ответу @yivi, который показывает вам, как вы можете переопределить вывод типа или подавить ошибку, вы также можете объяснить тип в Psalm, предоставив правильный документальный блок с использованием условных типов либо непосредственно в исходном коде (если вы контролируете это), либо в файле-заглушке .

      /**
 * Returns a header value by name.
 *
 * @psalm-return ($default is null ? (string|null) : string)
 */
public function get(string $key, string $default = null) { /* */ }

https://psalm.dev/r/41b8471847

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