【发布时间】:2021-10-08 19:09:01
【问题描述】:
假设你有这样一个类:
class MyClass
{
public function __construct(public int $id, public string $foo)
{
}
}
和一个生成器创建该类的多个实例,如下所示:
$myGenerator = function (): \Generator {
yield new MyClass(id: 21, foo: 'fnord');
yield new MyClass(id: 13, foo: 'baz');
yield new MyClass(id: 42, foo: 'Thanks for the fish');
};
如何键入提示生成器函数,以便它在迭代期间推断每个元素的类型?
foreach ($myGenerator as $instance) {
$instance-> // no autocompletion in IDE as type is not known
}
我不想做:
foreach ($myGenerator as $instance) {
/** @var MyClass $instance */
$instance-> // now autocomplete works inside an IDE
}
因为它会用冗余的类型提示来纠缠生成器的每次使用。我想在生成器的返回类型级别上提供一次。
有没有更好的替代方法来输入提示生成器?
在伪代码中,我希望能够执行以下操作:
$myGenerator = function (): \Generator<MyClass> {...}
我认为 php 的类型系统不适合这个,我不介意使用 phpdocs / phpstan。主要用例是 IDE 支持(在我的例子中是 phpStorm,尽管它应该可以工作)。
【问题讨论】:
-
显然,它可能通过 phpstan 实现,虽然我还不知道如何在 phpstorm 中激活:phpstan.org/blog/generics-in-php-using-phpdocs
-
在 PhpStorm 中对泛型的支持已在几天前发布的最新版本中添加 - 因此,如果您可以为此使用 PHPDocs(这并不意味着您必须使用 PHPStan,如PhpStorm 和 PHPStan 都只读取该数据),这在更新 PhpStorm 后可能会有所帮助
-
@NicoHaase 最新版本,你是指2021.2还是EAP?因为它在我的 2021.2 机器上似乎不起作用。你能扩展一下吗?
-
@NicoHaase 我发现了这篇博文,虽然它谈到了泛型文档,但我不知道它是否可以应用于生成器以及如何应用。 blog.jetbrains.com/phpstorm/2021/07/phpstorm-2021-2-beta
-
是的,完全一样?或者喜欢
/** @var MyClass[] $generator **/?
标签: php phpstorm generator type-hinting phpdoc