IteratorAggregate满足Psalm和PhpStorm的适当类型提示

2ic8powd  于 2023-01-29  发布在  PHP
关注(0)|答案(1)|浏览(102)

我有使用IteratorAggregate接口的集合。我找不到一种方法来正确地输入提示,使诗篇和PhpStorm都满意。
下面是一个简化的例子,它有一个AbstractCollection和一个Collection,但是实际上有多个集合扩展了AbstractCollection,这个例子在PhpStorm上运行良好,但是Psalm抱怨了它。
https://psalm.dev/r/9a3fc1db43
我尝试了几种方法,但都没有真正起作用。有什么想法吗?我如何在迭代集合时在PhpStorm中获得适当的类型暗示,但同时Psalm没有抱怨吗?

2cmtqfgy

2cmtqfgy1#

这应该行得通:https://psalm.dev/r/24c1344df3

<?php

/**
 * @template TValue
 * @template-implements IteratorAggregate<string, TValue>
 */
abstract class AbstractCollection implements IteratorAggregate 
{
    /**
     * @var array<string, TValue>
     */
    protected array $items = [];
    
    /** @return ArrayIterator<string, TValue> */
    public function getIterator(): ArrayIterator
    {
        return new ArrayIterator($this->items);
    }
}

/**
 * @template-extends AbstractCollection<string>
 */
class Collection extends AbstractCollection 
{
    public function __construct() {
        $this->items = ['foo' => 'bar'];
    }
}

foreach (new Collection() as $item) {
    echo $item; // PHPStorm should know the type here
}

您错过了AbstractCollection::getIterator()上的文档块。

相关问题