diff --git a/src/Illuminate/Collections/HigherOrderCollectionProxy.php b/src/Illuminate/Collections/HigherOrderCollectionProxy.php index 106356c3acc5..c5a723dd2134 100644 --- a/src/Illuminate/Collections/HigherOrderCollectionProxy.php +++ b/src/Illuminate/Collections/HigherOrderCollectionProxy.php @@ -3,14 +3,19 @@ namespace Illuminate\Support; /** - * @mixin \Illuminate\Support\Enumerable + * @template TKey of array-key + * + * @template-covariant TValue + * + * @mixin \Illuminate\Support\Enumerable + * @mixin TValue */ class HigherOrderCollectionProxy { /** * The collection being operated on. * - * @var \Illuminate\Support\Enumerable + * @var \Illuminate\Support\Enumerable */ protected $collection; @@ -24,7 +29,7 @@ class HigherOrderCollectionProxy /** * Create a new proxy instance. * - * @param \Illuminate\Support\Enumerable $collection + * @param \Illuminate\Support\Enumerable $collection * @param string $method * @return void */ diff --git a/src/Illuminate/Collections/Traits/EnumeratesValues.php b/src/Illuminate/Collections/Traits/EnumeratesValues.php index 78690232970b..8798ef6be603 100644 --- a/src/Illuminate/Collections/Traits/EnumeratesValues.php +++ b/src/Illuminate/Collections/Traits/EnumeratesValues.php @@ -24,35 +24,35 @@ * * @template-covariant TValue * - * @property-read HigherOrderCollectionProxy $average - * @property-read HigherOrderCollectionProxy $avg - * @property-read HigherOrderCollectionProxy $contains - * @property-read HigherOrderCollectionProxy $doesntContain - * @property-read HigherOrderCollectionProxy $each - * @property-read HigherOrderCollectionProxy $every - * @property-read HigherOrderCollectionProxy $filter - * @property-read HigherOrderCollectionProxy $first - * @property-read HigherOrderCollectionProxy $flatMap - * @property-read HigherOrderCollectionProxy $groupBy - * @property-read HigherOrderCollectionProxy $keyBy - * @property-read HigherOrderCollectionProxy $map - * @property-read HigherOrderCollectionProxy $max - * @property-read HigherOrderCollectionProxy $min - * @property-read HigherOrderCollectionProxy $partition - * @property-read HigherOrderCollectionProxy $percentage - * @property-read HigherOrderCollectionProxy $reject - * @property-read HigherOrderCollectionProxy $skipUntil - * @property-read HigherOrderCollectionProxy $skipWhile - * @property-read HigherOrderCollectionProxy $some - * @property-read HigherOrderCollectionProxy $sortBy - * @property-read HigherOrderCollectionProxy $sortByDesc - * @property-read HigherOrderCollectionProxy $sum - * @property-read HigherOrderCollectionProxy $takeUntil - * @property-read HigherOrderCollectionProxy $takeWhile - * @property-read HigherOrderCollectionProxy $unique - * @property-read HigherOrderCollectionProxy $unless - * @property-read HigherOrderCollectionProxy $until - * @property-read HigherOrderCollectionProxy $when + * @property-read HigherOrderCollectionProxy $average + * @property-read HigherOrderCollectionProxy $avg + * @property-read HigherOrderCollectionProxy $contains + * @property-read HigherOrderCollectionProxy $doesntContain + * @property-read HigherOrderCollectionProxy $each + * @property-read HigherOrderCollectionProxy $every + * @property-read HigherOrderCollectionProxy $filter + * @property-read HigherOrderCollectionProxy $first + * @property-read HigherOrderCollectionProxy $flatMap + * @property-read HigherOrderCollectionProxy $groupBy + * @property-read HigherOrderCollectionProxy $keyBy + * @property-read HigherOrderCollectionProxy $map + * @property-read HigherOrderCollectionProxy $max + * @property-read HigherOrderCollectionProxy $min + * @property-read HigherOrderCollectionProxy $partition + * @property-read HigherOrderCollectionProxy $percentage + * @property-read HigherOrderCollectionProxy $reject + * @property-read HigherOrderCollectionProxy $skipUntil + * @property-read HigherOrderCollectionProxy $skipWhile + * @property-read HigherOrderCollectionProxy $some + * @property-read HigherOrderCollectionProxy $sortBy + * @property-read HigherOrderCollectionProxy $sortByDesc + * @property-read HigherOrderCollectionProxy $sum + * @property-read HigherOrderCollectionProxy $takeUntil + * @property-read HigherOrderCollectionProxy $takeWhile + * @property-read HigherOrderCollectionProxy $unique + * @property-read HigherOrderCollectionProxy $unless + * @property-read HigherOrderCollectionProxy $until + * @property-read HigherOrderCollectionProxy $when */ trait EnumeratesValues { diff --git a/types/Support/Collection.php b/types/Support/Collection.php index 94769f8dc8ee..290973923f17 100644 --- a/types/Support/Collection.php +++ b/types/Support/Collection.php @@ -1112,3 +1112,34 @@ public function getWithoutZebras(): Collection $zoo = new Zoo(); assertType('Illuminate\Support\Collection', $zoo->getWithoutZebras()); + +$coll = $zoo->getWithoutZebras(); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->average); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->avg); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->contains); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->doesntContain); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->each); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->every); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->filter); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->first); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->flatMap); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->groupBy); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->keyBy); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->map); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->max); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->min); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->partition); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->percentage); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->reject); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->skipUntil); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->skipWhile); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->some); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->sortBy); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->sortByDesc); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->sum); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->takeUntil); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->takeWhile); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->unique); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->unless); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->until); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->when); diff --git a/types/Support/LazyCollection.php b/types/Support/LazyCollection.php index eb3fab4140f0..17c3fcb63815 100644 --- a/types/Support/LazyCollection.php +++ b/types/Support/LazyCollection.php @@ -1,6 +1,7 @@ + */ + private Collection $animals; + + public function __construct() + { + $this->animals = collect([ + new LazyTiger, + new LazyLion, + new LazyZebra, + ]); + } + + /** + * @return \Illuminate\Support\LazyCollection + */ + public function getWithoutZebras(): LazyCollection + { + return $this->animals->lazy()->filter(fn (LazyAnimal $animal) => ! $animal instanceof LazyZebra); + } +} + +$zoo = new LazyZoo(); + +$coll = $zoo->getWithoutZebras(); + +assertType('Illuminate\Support\LazyCollection', $coll); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->average); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->avg); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->contains); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->doesntContain); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->each); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->every); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->filter); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->first); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->flatMap); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->groupBy); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->keyBy); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->map); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->max); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->min); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->partition); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->percentage); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->reject); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->skipUntil); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->skipWhile); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->some); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->sortBy); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->sortByDesc); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->sum); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->takeUntil); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->takeWhile); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->unique); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->unless); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->until); +assertType('Illuminate\Support\HigherOrderCollectionProxy', $coll->when);