diff --git a/src/Illuminate/Collections/Arr.php b/src/Illuminate/Collections/Arr.php index ab0b5183d10d..b99ce7a22283 100644 --- a/src/Illuminate/Collections/Arr.php +++ b/src/Illuminate/Collections/Arr.php @@ -216,10 +216,14 @@ public static function first($array, ?callable $callback = null, $default = null /** * Return the last element in an array passing a given truth test. * - * @param array $array - * @param callable|null $callback - * @param mixed $default - * @return mixed + * @template TKey + * @template TValue + * @template TLastDefault + * + * @param iterable $array + * @param (callable(TValue, TKey): bool)|null $callback + * @param TLastDefault|(\Closure(): TLastDefault) $default + * @return TValue|TLastDefault */ public static function last($array, ?callable $callback = null, $default = null) { diff --git a/types/Support/Arr.php b/types/Support/Arr.php index c2cd33580d95..b0bbed63a0fd 100644 --- a/types/Support/Arr.php +++ b/types/Support/Arr.php @@ -54,3 +54,48 @@ assertType('string|User', Arr::first($traversable, null, function () { return 'string'; })); + +assertType('User|null', Arr::last($array)); +assertType('User|null', Arr::last($array, function ($user) { + assertType('User', $user); + + return true; +})); +assertType('string|User', Arr::last($array, function ($user) { + assertType('User', $user); + + return false; +}, 'string')); +assertType('string|User', Arr::last($array, null, function () { + return 'string'; +})); + +assertType('User|null', Arr::last($iterable)); +assertType('User|null', Arr::last($iterable, function ($user) { + assertType('User', $user); + + return true; +})); +assertType('string|User', Arr::last($iterable, function ($user) { + assertType('User', $user); + + return false; +}, 'string')); +assertType('string|User', Arr::last($iterable, null, function () { + return 'string'; +})); + +assertType('User|null', Arr::last($traversable)); +assertType('User|null', Arr::last($traversable, function ($user) { + assertType('User', $user); + + return true; +})); +assertType('string|User', Arr::last($traversable, function ($user) { + assertType('User', $user); + + return false; +}, 'string')); +assertType('string|User', Arr::last($traversable, null, function () { + return 'string'; +}));