Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Type Laravel Package

typhoon/type

Typhoon Type provides an object abstraction over PHP’s modern type system for building tools that understand complex types. Define, print (stringify), and work with array shapes, object types, non-empty lists, and more in a consistent API.

View on GitHub
Deep Wiki
Context7

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
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
terminal42/code-quality-tools
codifyo/ts-generator-bundle
andydefer/laravel-cluster
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky