如何解决使用 psalm 扩展接口的泛型
我已经习惯使用圣歌,但我遇到了一个问题。我已经在 C# 中使用了这个结构,它对我有用。我真的不知道如何使用 psalm 来解决这个问题。
我有一个 ContextInterface
和另一个实现它。
interface ContextInterface { public function getProductId(): int; }
interface SingleContextInterface extends ContextInterface { public function getWidth(): int; }
此外,我为他们准备了策略界面。
/**
* @template-covariant T as ContextInterface
* @psalm-immutable
*/
interface CalculatorInterface
{
/**
* @psalm-param T $context
*/
public function getPrice(ContextInterface $context): int;
}
/**
* @template T as SingleContextInterface
* @template-extends CalculatorInterface<T>
* @psalm-immutable
*/
interface SingleDimensionalPriceCalculator extends CalculatorInterface { }
还有一个实现接口的类:
/**
* @template T as SingleContextInterface
* @template-implements SingleDimensionalPriceCalculator<T>
* @psalm-immutable
*/
class SingleDimensioncalculator implements SingleDimensionalPriceCalculator
{
/**
* @psalm-param SingleContextInterface $context
*/
public function getPrice(ContextInterface $context): int
{
$context->getWidth();
return 1;
}
}
ERROR: ImpureMethodCall - 37:19 - Cannot call an possibly-mutating method SingleContextInterface::getWidth from a mutation-free context
psalm.dev 上的示例
当然真实案例更复杂,包含更多接口。
解决方法
我想,问题在于我将 CalculatorInterface
上的模板标记为协变。我可以不扩展它,它是协变的。
psalm.dev 上的示例
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。