Skip to content

Commit

Permalink
Add basic template annotations
Browse files Browse the repository at this point in the history
This adds basic type safety annotations for static analyzers like PHPStan and Psalm. This will cover around 80% of the use cases and a follow-up PR for all supported versions will be proposed later to get it to a 100% of close to a 100%.

By adding these annotations methods returning a promise can hint their resolving type by adding `@return PromiseInterface<bool>` when they for example resolve to a boolean. By doing that Psalm and PHPStan will understand that the following bit of code will not become an issue because the method's contract promised a boolean through the promise:

```php
$promise->then(static function (bool $isEnabled) {});
```

However, the following will yield errors:

```php
$promise->then(static function (string $isEnabled) {});
```

This PR is a requirement for reactphp/async#40
  • Loading branch information
WyriHaximus committed Jun 22, 2022
1 parent 77aa876 commit 65f3f06
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions src/PromiseInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace React\Promise;

/** @template T */
interface PromiseInterface
{
/**
Expand Down Expand Up @@ -32,10 +33,11 @@ interface PromiseInterface
* than once.
* 3. `$onProgress` (deprecated) may be called multiple times.
*
* @param callable|null $onFulfilled
* @template TReturn of mixed
* @param callable(T): TReturn $onFulfilled
* @param callable|null $onRejected
* @param callable|null $onProgress This argument is deprecated and should not be used anymore.
* @return PromiseInterface
* @return (TReturn is PromiseInterface ? TReturn : PromiseInterface<TReturn>)
*/
public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null);
}

0 comments on commit 65f3f06

Please sign in to comment.