Skip to content

typhoon-php/type

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Typhoon Type

PHP Version Requirement GitHub Release PHPStan Code Coverage Mutation testing badge

Typhoon Type is an object abstraction over the modern PHP type system. Use this library to build tools that work with sophisticated types:

use function Typhoon\Type\arrayShapeT;
use function Typhoon\Type\objectT;
use function Typhoon\Type\nonEmptyListT;

$json = <<<JSON
    {
        "people": [
            {"name": "Valentin"},
            {"name": "Andrey"}
        ],
    }
    JSON;
    
final readonly class Person
{
    public function __construct(
        public string $name,
    ) {}    
}

$type = arrayShapeT([
    'people' => nonEmptyListT(objectT(Person::class)),
]);

$request = new Mapper()->map($json, $type);

Installation

composer require typhoon/type

Printing types

To print any type, use stringify():

use function Typhoon\Type\stringify;

$type = arrayShapeT([
    'people' => nonEmptyListT(objectT(Person::class)),
]);

var_dump(stringify($type));

// array{'people': non-empty-list<Person>}

Supported types

Native

Typhoon Native
nullT null
voidT void
neverT never
falseT false
trueT true
boolT bool
intT int
floatT float
stringT string
arrayT array
objectT object
objectT(Foo::class) Foo
selfT self
parentT parent
staticT static
iterableT iterable
callableT callable
resourceT resource
nullOrT(stringT) ?string
unionT(intT, stringT) int|string
intersectionT(objectT(Countable::class), objectT(Traversable::class)) Countable&Traversable
mixedT mixed

PHPDoc numbers

Typhoon PHPDoc
intT(123) 123
positiveIntT positive-int
negativeIntT negative-int
nonPositiveIntT non-positive-int
nonNegativeIntT non-negative-int
nonZeroIntT non-zero-int
intRangeT(-5, 6) int<-5, 6>
intRangeT(max: 6) int<min, 6>
intRangeT(min: -5) int<-5, max>
intMaskT(1, 2, 4) int-mask<1, 2, 4>
intMaskT(classConstantMaskT(Foo::class, 'INT_*') int-mask-of<Foo::INT_*>
floatT(12.5) 12.5
floatRangeT(-0.001, 2.344) float<-0.001, 2.344>

PHPDoc strings

Typhoon PHPDoc
nonEmptyStringT non-empty-string
truthyStringT, nonFalsyStringT truthy-string, non-falsy-string
numericStringT numeric-string
lowercaseString lowercase-string
stringT('abc') 'abc'
classT(Foo::class), classStringT(Foo::class), classT(objectT(Foo::class)) class-string<Foo>
stringT(Foo::class), classConstantT(Foo::class, 'class') Foo::class
literalStringT literal-string

PHPDoc constants

Typhoon PHPDoc
constantT('PHP_INT_MAX') PHP_INT_MAX
constantMaskT('JSON_*') JSON_*
classConstantT(Foo::class, 'BAR') Foo::BAR
classConstantMaskT(Foo::class, 'IS_*') Foo::IS_*

PHPDoc arrays and iterables

Typhoon PHPDoc
arrayT(value: objectT(Foo::class)) Foo[]
listT(stringT) list<string>
nonEmptyListT(stringT) non-empty-list<string>
listShapeT([intT, stringT]) list{int, string}
arrayShapeT([intT, optional(stringT)]) list{int, 1?: string}
unsealedListShapeT([intT]) list{int, ...}
unsealedListShapeT([intT], stringT) list{int, ...<string>}
arrayT(value: stringT) array<string>
arrayT(intT, stringT) array<int, string>
nonEmptyArrayT(arrayKeyT, stringT) non-empty-array<array-key, string>
arrayShapeT() array{}
arrayShapeT([intT, stringT]) array{int, string}
arrayShapeT([intT, 'a' => optional(stringT)]) array{int, a?: string}
unsealedArrayShapeT([intT]) array{int, ...}
unsealedArrayShapeT([floatT], intT, stringT) array{float, ...<int, string>}
keyOfT(classConstantT(Foo::class, 'ARRAY')) key-of<Foo::ARRAY>
valueOfT(classConstantT(Foo::class, 'ARRAY')) value-of<Foo::ARRAY>
offsetT($TArray->type, $TKey->type) TArray[TKey]
iterableT(objectT, stringT) iterable<object, string>
iterableT(value: stringT) iterable<string>

PHPDoc objects

Typhoon PHPDoc
objectT(Foo::class, [stringT, floatT]) Foo<string, float>
selfT([stringT, floatT]) self<string, float>
parentT([stringT, floatT]) parent<string, float>
staticT([stringT, floatT]) static<string, float>
objectShapeT(['prop' => stringT]) object{prop: string}
objectShapeT(['prop' => optional(stringT))]) object{prop?: string}

PHPDoc callables

Typhoon PHPDoc
callableT([stringT], voidT) callable(string): void
callableT([param(stringT, default: true)]) callable(string=): mixed
callableT([param(stringT, variadic: true)]) callable(string...): mixed
callableT([param(stringT, byRef: true)]) callable(string&): mixed
closureT([stringT], voidT) Closure(string): void
closureT([param(stringT, default: true)]) Closure(string=): mixed
closureT([param(stringT, variadic: true)]) Closure(string...): mixed
closureT([param(stringT, byRef: true)]) Closure(string&): mixed

Union aliases

Typhoon PHPDoc
array-key arrayKeyT
numericT numeric
scalarT scalar

About

Typhoon Type System

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project

Contributors 2

  •  
  •