Psalm
Get started
Documentation
Paid support
Plugins
Blog
GitHub
<?php interface BasePackage {} interface InnerPackage extends BasePackage {} /** * @template TInnerPackage of InnerPackage */ interface GenericPackage extends BasePackage { /** @return TInnerPackage */ public function unwrap() : InnerPackage; } interface SomeInnerPackage extends InnerPackage {} /** * @extends GenericPackage<SomeInnerPackage> */ interface SomePackage extends GenericPackage {} /** * @template TInnerPackage of InnerPackage * @template TGenericPackage of GenericPackage<TInnerPackage> * @param TGenericPackage $package * @return TInnerPackage */ function unwrapGeneric(GenericPackage $package) { return $package->unwrap(); } /** * @template TInnerPackage of InnerPackage * @template TGenericPackage of GenericPackage<TInnerPackage> * @param class-string<TGenericPackage> $class FQCN to be instantiated * @return TInnerPackage */ function loadWithDirectUnwrap(string $class) { $package = new $class(); return $package->unwrap(); } /** * @template TInnerPackage of InnerPackage * @template TGenericPackage of GenericPackage<TInnerPackage> * @param class-string<TGenericPackage> $class FQCN to be instantiated * @return TInnerPackage */ function loadWithIndirectUnwrap(string $class) { $package = new $class(); return unwrapGeneric($package); } $result = loadWithDirectUnwrap(SomePackage::class); /** @psalm-trace $result */ // expected: SomePackage|SomeInnerPackage
Snippet created on February 26 2021 at 19:12 UTC
Settings
Get link