typhoon / type
Typhoon Type System
Fund package maintenance!
0.8.1
2026-04-22 17:31 UTC
Requires
- php: ^8.3
Requires (Dev)
- phpunit/phpunit: ^12
- symfony/var-dumper: ^7.3.5
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
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 |