升级到 Laravel 10 后,Larastan 抱怨收集方法参数

Fab*_*sso 5 php laravel phpstan laravel-10

升级到 Laravel 10 后,我遇到了 Larastan 错误的困难时期。

下面的代码在 1 小时前还完全正常:

return $this->articleRepository->getDefaultArticles($organizationId)
    ->toBase()
    ->map(function (Article $article) {
        return new Content(
            $article->id,
            $article->title,
            $article->language,
        );
    })
    ->toArray();
Run Code Online (Sandbox Code Playgroud)

现在给我以下错误:

方法 Illuminate\Support\Collection<(int|string),Illuminate\Database\Eloquent\Model>::map() 的参数 #1 $callback 需要 callable(Illuminate\Database\Eloquent\Model, int|string): App\学院\内容,
关闭(应用程序\模型\文章):给出的应用程序\学院\内容

存储库方法有正确的提示:

/**
 * @return Collection<Article>
 */
public function getDefaultArticles(OrganizationId $organizationId): Collection
{
    /** @var Collection<Article> */
    return Article::query()
        ->where('organization_id', $organizationId)
        ->get()
        ->keyBy('id')
        ->values();
}
Run Code Online (Sandbox Code Playgroud)

它给了我 115 个新错误,其中大多数与此类似,与map和等收集方法相关reduce

快速解决方案是使用临时变量并添加类型提示:

/** @var Collection<Article> $articles */
$articles = $this->articleRepository
    ->getDefaultArticles($organizationId)
    ->toBase();
Run Code Online (Sandbox Code Playgroud)

但我不想执行 100 次,甚至 IDE 也抱怨这是不必要的

在此输入图像描述

预先感谢您的帮助!

Yev*_*yev 1

到目前为止,我发现的唯一解决方法是通过类型提示分两步完成。

/** @var \Illuminate\Support\Collection $result */
$result = $this->articleRepository->getDefaultArticles($organizationId);

return $result->map(function (Article $article) {
    return new Content(
        $article->id,
        $article->title,
        $article->language,
    );
})
->toArray();
Run Code Online (Sandbox Code Playgroud)

它对于处理 115 个新错误并没有真正的帮助。但如果你有几个错误,它会有所帮助。