在 Laravel 的 LengthAwarePaginator 上实现泛型

问题描述 投票:0回答:1

我想改进 Laravel 分页功能的使用打字。为此,我尝试通过 PHPDoc 使用泛型。我制作了我们自己的分页器类来扩展 Laravel 的分页器类,其中包含类型的文档块:

/**
 * @template T
 */
class MyPaginator extends LengthAwarePaginator
{
    /**
     * @return array<T>
     */
    public function items(): array
    {
        return parent::items();
    }
}

我从这样的方法返回它:

/**
 * @return MyPaginator<CampaignTemplateListDto>
 */
public function list(): MyPaginator
{
    // ... code omitted for brevity

    // $paginator is Laravel's LengthAwarePaginator
    $paginator = $query->paginate();
    
    return new MyPaginator($paginator->items(), $paginator->total(), $paginator->perPage(), $paginator->currentPage());
}

但是我的 IDE (PhpStorm) 无法识别

items()
中出现的类型是
CampaignTemplateListDto
的数组,它认为它是
mixed
:

enter image description here

事实上,我根本不知道它从哪里得到

mixed
,因为
MyPaginator::items()
LengthAwarePaginator::items()
都只是返回一个数组。

如何让我的 IDE 理解

MyPaginator::items()
正在返回
CampaignTemplateListDto
对象数组?

php laravel generics pagination
1个回答
0
投票

应设置类级通用注释以指示

MyPaginator
适用于类型 T(在您的情况下为 CampaignTemplateListDto)。您应该在
@extends LengthAwarePaginator<T>
中添加
MyPaginator
注释,如下所示:

/**
 * @template T
 * @extends LengthAwarePaginator<T>
 */
class MyPaginator extends LengthAwarePaginator
{
    /**
     * @return array<T>
     */
    public function items(): array
    {
        return parent::items();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.