Skip to content

Repository files navigation

Typhoon Type

PHP Version RequirementGitHub ReleasePHPStanCode CoverageMutation 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:

usefunctionTyphoon\Type\arrayShapeT;
usefunctionTyphoon\Type\objectT;
usefunctionTyphoon\Type\nonEmptyListT;
$json = <<<JSON { "people": [ {"name": "Valentin"}, {"name": "Andrey"} ], } JSON;
finalreadonlyclass Person
{
publicfunction__construct(
publicstring$name,
) {} }
$type = arrayShapeT([
'people' => nonEmptyListT(objectT(Person::class)),
]);
$request = newMapper()->map($json, $type);

Installation

composer require typhoon/type

Printing types

To print any type, use stringify():

usefunctionTyphoon\Type\stringify;
$type = arrayShapeT([
'people' => nonEmptyListT(objectT(Person::class)),
]);
var_dump(stringify($type));
// array{'people': non-empty-list<Person>}

Supported types

Native

TyphoonNative
nullTnull
voidTvoid
neverTnever
falseTfalse
trueTtrue
boolTbool
intTint
floatTfloat
stringTstring
arrayTarray
objectTobject
objectT(Foo::class)Foo
selfTself
parentTparent
staticTstatic
iterableTiterable
callableTcallable
resourceTresource
nullOrT(stringT)?string
unionT(intT, stringT)int|string
intersectionT(objectT(Countable::class), objectT(Traversable::class))Countable&Traversable
mixedTmixed

PHPDoc numbers

TyphoonPHPDoc
intT(123)123
positiveIntTpositive-int
negativeIntTnegative-int
nonPositiveIntTnon-positive-int
nonNegativeIntTnon-negative-int
nonZeroIntTnon-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

TyphoonPHPDoc
nonEmptyStringTnon-empty-string
truthyStringT, nonFalsyStringTtruthy-string, non-falsy-string
numericStringTnumeric-string
lowercaseStringlowercase-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
literalStringTliteral-string

PHPDoc constants

TyphoonPHPDoc
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

TyphoonPHPDoc
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

TyphoonPHPDoc
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

TyphoonPHPDoc
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

TyphoonPHPDoc
array-keyarrayKeyT
numericTnumeric
scalarTscalar

About

Typhoon Type System

Topics

Resources

Stars

65 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages