Skip to content

インターセクション型

Type1&Type2&Type3 形式のアノテーションは インターセクション型 です。任意の値は Type1Type2Type3 を同時に満たす必要があります。Type1Type2Type3 はすべて アトミック型 です。

例えば、PHPUnitテストで次のステートメントの後:

<?php
$hare = $this->createMock(Hare::class);

$hareHare を拡張し、\PHPUnit\Framework\MockObject\MockObject を実装するクラスのインスタンスになります。そのため、$hareHare&\PHPUnit\Framework\MockObject\MockObject と型付けされます。この構文は、値が複数のインターフェースを実装する必要がある場合はいつでも使用できます。

もう1つの使用例は、オブジェクトライクな配列をマージできるようにすることです:

/** 
 * @psalm-type A=array{a: int}
 * @psalm-type B=array{b: int}
 *
 * @param A $a
 * @param B $b
 *
 * @return A&B
 */
function foo($a, $b) {
    return $a + $b;
}

返される型には AB の両方のプロパティが含まれます。言い換えれば、{a: int, b: int} になります。

インターセクションは、オブジェクト型 のリストのみ、または オブジェクトライクな配列 のリストのみに対して有効です。

ユーザーノート