vimeo/psalm

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

Aperta

#6381 aperta il 31 ago 2021

 (5 commenti) (0 reazioni) (0 assegnatari)PHP (668 fork)batch import
Help wantedbugtype reconciliation

Metriche repository

Star
 (5369 stelle)
Metriche merge PR
 (Metriche PR in attesa)

Descrizione

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

Guida contributor