php - 如何在 php 中输入提示生成器?
问题描述
假设你有一个像这样的类:
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,尽管它应该可以工作)。
解决方案
像 phpdoc 上的其他集合一样
/**
* @return \Generator|MyClass[]
*/
$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');
};
推荐阅读
- c# - 如何实例化一个游戏对象而不是它的克隆
- scala - Scala:是什么让 Collatz Sequences 的算法如此低效?
- aws-lambda - sam 本地调用找不到 lambda 图层图像
- javascript - 将带有空格的文本从 python 后端传递到 html 视图
- python-3.x - 使用 Tkinter 输入的问题 - Python
- java - 使用 jgit 克隆 repo 时出现 java.lang.StackOverflowError
- c# - 如何使用字典和嵌套列表为 TreeView 编写 XAML?
- r - 有人可以在不使用预建函数的情况下创建一个简单的移动平均线(比如说 20 SMA)函数吗
- getstream-io - 当获得多项活动及其反应时,有没有办法让反应从最旧到最新?
- c# - 自定义实例提供程序不会在 Xamarin.Forms 应用程序中触发