Псалом, возможно, нулевое значение, предоставленное с помощью 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) { /* */ }