vimeo/psalm
View on GitHubCalling to `Map::union/intersect/diff()` etc. modifies args generic type
Open
#6,381 opened on Aug 31, 2021
Help wantedbugtype reconciliation
Repository metrics
- Stars
- (5,369 stars)
- PR merge metrics
- (Avg merge 3d 12h) (5 merged PRs in 30d)
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