【问题标题】:How to create intersection type of arrays如何创建数组的交集类型
【发布时间】:2020-07-20 06:40:58
【问题描述】:

我试图实现的简化如下:

<?php

/**
 * @psalm-type Foo=array{foo: string}
 * @psalm-type Bar=array{bar: int}
 */

/**
 * @param Foo&Bar $v
 */
function acceptFooAndBar(array $v): void {
    echo sprintf('%s %d', $v['foo'], $v['bar']);
}

acceptFooAndBar(['foo' => 'f', 'bar' => 42]);

https://psalm.dev/r/d08f3ea0d1

简而言之:我正在尝试键入一个函数,该函数接受一个数组,该数组是另外两个@psalm-types 的交集。也就是说:一个数组包含两种数组类型的字段(它们是唯一的并且保证是不同的)。

此代码符合预期 - 不进行类型检查:

ERROR: InvalidDocblock - 9:11 - Intersection types must all be objects, Psalm\Type\Atomic\ObjectLike provided in docblock for acceptFooAndBar

真的没有办法,只能坚持运行时断言/检查吗?

重要提示:这个问题完全是关于静态类型的,我知道你可以在运行时检查它。

【问题讨论】:

    标签: php typing static-typing psalm-php


    【解决方案1】:

    我将其报告为错误https://github.com/vimeo/psalm/issues/3095,并已修复为https://github.com/vimeo/psalm/commit/09663b593895fb7e6a0ed789dfad11363999bfea

    所以现在它可以正确地进行类型检查了。

    【讨论】:

      猜你喜欢
      • 2012-05-30
      • 2020-05-21
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多