phpstan::Method(methodname)返回类型与泛型接口(interfacename)未指定其类型

pdtvr36n  于 2022-12-02  发布在  PHP
关注(0)|答案(1)|浏览(113)

我已经为有序列表定义了一个接口。类docblock看起来像这样:

/**
 * Interface ListOrderedInterface
 * @template ListOrderedElement
 */

在这个接口的方法docblocks中,ListOrderedElement用于确保添加到列表中的内容的类型是一致的。PHPStan在ListOrderedInterface.php上干净地运行。到目前为止一切都很好。
接下来,我为一个工厂定义了一个接口,这个接口生成一个有序列表。

/**
 * Class ListFactoryInterface
 */
interface ListOrderedFactoryInterface
{
    /**
     * makeList
     * @return ListOrderedInterface
     */
    public function makeList(): ListOrderedInterface;
}

phpstan正在抱怨并显示警告消息“phpstan::具有泛型接口ListOrderedInterface得方法makeList返回类型未指定其类型”.“我不知道如何指定该接口得类型.
谢谢你帮忙。

6uxekuva

6uxekuva1#

您需要在makeList phpdoc的@return部分中为ListOrderedInterface提供一个专门化。

interface ListOrderedFactoryInterface
{
    /**
     * This is an example with a concrete type, syntax is <type>
     * @return ListOrderedInterface<string>
     */
    public function makeList(): ListOrderedInterface;
}

如果您还需要将其泛型化,则还需要在工厂中添加@模板,并从makeList返回泛型类型。

/**
 * @template T
 */
interface ListOrderedFactoryInterface
{
    /**
     * @return ListOrderedInterface<T>
     */
    public function makeList(): ListOrderedInterface;
}

在实现FactoryInterface的类中,添加@implements phpdoc。

/**
 * Instead of string put the actual type it should return
 * @implements ListOrderedFactoryInterface<string>
 */
class ConcreteFactory implements ListOrderedFactoryInterface
{
}

您可以在官方文档中找到更多示例:https://phpstan.org/blog/generics-by-examples

相关问题