我想改进 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
:
事实上,我根本不知道它从哪里得到
mixed
,因为 MyPaginator::items()
和 LengthAwarePaginator::items()
都只是返回一个数组。
如何让我的 IDE 理解
MyPaginator::items()
正在返回 CampaignTemplateListDto
对象数组?
应设置类级通用注释以指示
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();
}
}