Skip to content

Commit bb96a7b

Browse files
committed
Describe callable arguments for Deferred
1 parent baf9ab5 commit bb96a7b

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

src/Deferred.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@ final class Deferred
1212
*/
1313
private $promise;
1414

15-
/** @var callable */
15+
/** @var callable(T):void */
1616
private $resolveCallback;
1717

18-
/** @var callable */
18+
/** @var callable(\Throwable):void */
1919
private $rejectCallback;
2020

21+
/**
22+
* @param (callable(callable(T):void,callable(\Throwable):void):void)|null $canceller
23+
*/
2124
public function __construct(callable $canceller = null)
2225
{
2326
$this->promise = new Promise(function ($resolve, $reject): void {

tests/Internal/CancellationQueueTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public function rethrowsExceptionsThrownFromCancel(): void
101101
*/
102102
private function getCancellableDeferred(): Deferred
103103
{
104+
/** @var Deferred<never> */
104105
return new Deferred($this->expectCallableOnce());
105106
}
106107
}

tests/types/deferred.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,40 @@
1010
$deferredB = new Deferred();
1111
$deferredB->resolve(42);
1212
assertType('React\Promise\PromiseInterface<int>', $deferredB->promise());
13+
14+
// $deferred = new Deferred();
15+
// $deferred->resolve(42);
16+
// assertType('React\Promise\Deferred<int>', $deferred);
17+
18+
// $deferred = new Deferred();
19+
// $deferred->resolve(true);
20+
// $deferred->resolve('ignored');
21+
// assertType('React\Promise\Deferred<bool>', $deferred);
22+
23+
// $deferred = new Deferred();
24+
// $deferred->reject(new \RuntimeException());
25+
// assertType('React\Promise\Deferred<never>', $deferred);
26+
27+
// invalid number of arguments passed to $canceller
28+
/** @phpstan-ignore-next-line */
29+
$deferred = new Deferred(function ($a, $b, $c) { });
30+
assertType('React\Promise\Deferred<mixed>', $deferred);
31+
32+
// invalid types for arguments of $canceller
33+
/** @phpstan-ignore-next-line */
34+
$deferred = new Deferred(function (int $a, string $b) { });
35+
assertType('React\Promise\Deferred<mixed>', $deferred);
36+
37+
// invalid number of arguments passed to $resolve
38+
$deferred = new Deferred(function (callable $resolve) {
39+
/** @phpstan-ignore-next-line */
40+
$resolve();
41+
});
42+
assertType('React\Promise\Deferred<mixed>', $deferred);
43+
44+
// invalid type passed to $reject
45+
$deferred = new Deferred(function (callable $resolve, callable $reject) {
46+
/** @phpstan-ignore-next-line */
47+
$reject(2);
48+
});
49+
assertType('React\Promise\Deferred<mixed>', $deferred);

0 commit comments

Comments
 (0)