vimeo/psalm

Calling to `Map::union/intersect/diff()` etc. modifies args generic type

Ouverte

#6 381 ouverte le 31 août 2021

 (5 commentaires) (0 réaction) (0 personne assignée)PHP (668 forks)batch import
Help wantedbugtype reconciliation

Métriques du dépôt

Stars
 (5 369 étoiles)
Métriques de merge PR
 (Métriques PR en attente)

Description

interface A {
    /**
     * @param TReturn $value
     *
     * @return Map<TReturn, TReturn>
     *
     * @template TReturn
     */
    public static function fc(mixed $value) : Map
    {
    }
}

/** @var A $a */
$a;

$result = $a::fc(true);

Type of $result is correctly Ds\Map<true, true>.

Though, when I route $result through any mutation-free function on another map instance ((new Map)->union($result)), it changes to Ds\Map<mixed, mixed>. I don't see any reason for type change.

https://psalm.dev/r/4243e3b2a8
https://psalm.dev/r/123220a2c8

Guide contributeur