Blade components are classes, and the constructor is the contract

An @include takes an array of variables with no declaration anywhere of which are required, which type they are, or what happens when one is missing.

final class Alert extends Component
{
    public string $type;
    public ?string $title;

    public function __construct(string $type = 'info', ?string $title = null)
    {
        $this->type  = $type;
        $this->title = $title;
    }

    public function render(): View
    {
        return view('components.alert');
    }
}

// <x-alert type="warning" title="Careful">Back up first.</x-alert>

The constructor is the signature, so a missing required argument is an error at render rather than an undefined variable notice buried in the output. Public properties and public methods are both available in the view automatically, which is convenient and means a public method with a side effect is a bad idea. Anything computed belongs in a method rather than in the constructor, because the constructor runs before the component knows about its slots.