@7nohe/laravel-typegen

中文文档
0.6.1发布于 2024/07/22MITTypeScriptCommonJS近 30 天下载 6395

The library lets you generate TypeScript types from your Laravel code.

原始使用文档
文档目录15 节
  1. Table of contents
  2. Features
  3. Supported Versions
  4. Installation
  5. Usage
  6. Enum Support
  7. Laravel Enum Support
  8. Use strongly typed route() function for ziggy
  9. Useful types for Laravel
  10. Form Request types
  11. Available options
  12. Development
  13. Setup example project
  14. Debug
  15. License

Laravel Typegen

Table of contents

Features

  • Generate types from Laravel's Models
  • Support Relationhips
  • Support Enum (from PHP8.1)
  • Generate types from Laravel's Form Requests
  • Generate types for ziggy (Routing)
  • Provide useful types for Laravel (e.g. pagination, etc.)

Supported Versions

This library supports the following versions:

  • Laravel 9.x and 10.x
  • TypeScript 5.0 and above

Installation

$ npm install -D @7nohe/laravel-typegen

Laravel Typegen may require installing doctrine/dbal via Composer in order to execute the php artisan model:show command internally.

$ composer require doctrine/dbal

Usage

Edit package.json

{
    "scripts": {
        "typegen": "laravel-typegen"
    },
}
$ npm run typegen

Enum Support

We also support php8.1 enums.

<!-- app/Enums/GenderType.php -->
<?php

namespace App\Enums;

enum GenderType: string
{
    case Male = 'Male';
    case Female = 'Female';
    case Other = 'Other';
}

Then, cast model attributes to enums.

<!-- app/Models/User.php -->
<?php

namespace App\Models;
use App\Enums\GenderType;

class User extends Authenticatable
{
    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'gender'            => GenderType::class,
    ];
}

This library will generate the following TypeScript types:

export type User = {
    id: number;
    name: string;
    email: string;
    gender: GenderType;
    email_verified_at?: string;
    created_at?: string;
    updated_at?: string;
    posts?: Post[];
};
export enum GenderType {
    Male = "Male",
    Female = "Female",
    Other = "Other"
}

Laravel Enum Support

If you use Laravel Enum, use the option --laravel-enum.

{
    "scripts": {
        "typegen": "laravel-typegen --laravel-enum"
    },
}

Use strongly typed route() function for ziggy

Running the laravel-typegen command with the --ziggy option will generate route.d.ts.

It helps typing the route() function.

{
    "scripts": {
        "typegen": "laravel-typegen --ziggy"
    },
}

For example, define the following routes

// routes/web.php
Route::resource('posts', PostsController::class);
$ php artisan route:list
GET|HEAD posts/{post} posts.show › PostsController@show

Parameters will be checked strictly based on the route name.

// in your TypeScript code

// OK
route('posts.show', { post: post.id })

// Error
route('posts.show', { id: post.id })

If you have created a project using the --typescript option of Laravel Breeze, you need to delete the declaration for the route() function in resources/js/types/global.d.ts.

import { PageProps as InertiaPageProps } from '@inertiajs/core';
import { AxiosInstance } from 'axios';
 import ziggyRoute, { Config as ZiggyConfig } from 'ziggy-js';
import { PageProps as AppPageProps } from './';

declare global {
    interface Window {
        axios: AxiosInstance;
    }

    var route: typeof ziggyRoute;
    var Ziggy: ZiggyConfig;
}

- declare module 'vue' {
-     interface ComponentCustomProperties {
-        route: typeof ziggyRoute;
-     }
- }

declare module '@inertiajs/core' {
    interface PageProps extends InertiaPageProps, AppPageProps {}
}

Useful types for Laravel

We provide useful types for Laravel (especially for Inertia).

For example, to return a paginated Inertia response in DashboardController, you can write the following

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Inertia\Inertia;

class DashboardController extends Controller
{
    public function __invoke()
    {
        $users = User::latest('id')->paginate(5);
        return Inertia::render(
            'Dashboard',
            [
                'users' => $users
            ]
        );
    }
}

You can import types already defined by Laravel Typegen.

<!-- Dashboard.vue -->
<script setup lang="ts">
import { Paginate } from '@7nohe/laravel-typegen';
import { User } from '@/types/model'; // generated types

defineProps<{ users: Paginate<User> }>();

</script>
<template>
    <div>
        <ul>
            <li v-for="user in users.data">- {{ user.name }}({{ user.email }})</li>
        </ul>
        <div class="flex justify-center mt-4 space-x-4">
            <Link v-for="(link, key) in users.links" :key="key" :href="link.url ?? '#'" v-html="link.label" />
        </div>
    </div>
</template>

Form Request types

You can generate types from Laravel's Form Request by executing the command with the --form-requests option.

If you have the Form Request class as shown below:

<?php

namespace App\Http\Requests;

use App\Models\User;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class ProfileUpdateRequest extends FormRequest
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {
        return [
            'name' => ['string', 'max:255'],
            'email' => ['email', 'max:255', Rule::unique(User::class)->ignore($this->user()->id)],
        ];
    }
}

The corresponding TypeScript types will be automatically generated as follows:

// formRequests.ts
export type ProfileUpdateRequest = {
    name?: string;
    email?: string;
};

By using these generated types in combination with HTTP Client libraries like Axios, you can write more type-safe code.

Available options

Usage: laravel-typegen [options]

Generate TypeScript types from your Laravel code

Options:
  -V, --version                output the version number
  -o, --output <value>         Output directory (default: "resources/js/types")
  --laravel-enum               Use Laravel Enum (default: false)
  --enum-path <value>          Path to enum files (default: "app/Enums")
  --model-path <value>         Path to model files (default: "app/Models")
  -z, --ziggy                  Generate types for ziggy (default: false)
  --vendor-routes              Include routes defined by vendor packages (default: false)
  --ignore-route-dts           Ignore generating route.d.ts (default: false)
  --form-request               Generate types for FormRequests (default: false)
  --form-request-path <value>  Path to FormRequest files (default: "app/Http/Requests")
  -h, --help                   display help for command

Development

Setup example project

$ cd examples/laravel10-app
$ cp .env.example .env
$ docker run --rm \
    -u "$(id -u):$(id -g)" \
    -v "$(pwd):/var/www/html" \
    -w /var/www/html \
    laravelsail/php81-composer:latest \
    composer install --ignore-platform-reqs
$ ./vendor/bin/sail up -d
$ ./vendor/bin/sail php artisan key:generate
$ ./vendor/bin/sail php artisan migrate --seed
$ ./vendor/bin/sail npm install

Debug

$ pnpm install
$ sh debug.sh

License

MIT

版本与发布记录

@7nohe/laravel-typegen 共发布 25 个版本,首次发布于 2022/11/21;过去 12 个月发布了 0 个版本。

版本发布日期距今
0.6.1latest2024/07/222 年前
0.6.02024/05/252 年前
0.5.42024/05/192 年前
0.5.32024/05/012 年前
0.5.22024/03/212 年前
0.5.12024/02/052 年前

关于 @7nohe/laravel-typegen 的常见问题

@7nohe/laravel-typegen 是什么?

The library lets you generate TypeScript types from your Laravel code.

如何安装 @7nohe/laravel-typegen?

在项目目录运行 npm install @7nohe/laravel-typegen,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 laravel-typegen,可以用 npx laravel-typegen 直接运行。

@7nohe/laravel-typegen 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@7nohe/laravel-typegen 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@7nohe/laravel-typegen 可以商用吗?

@7nohe/laravel-typegen 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@7nohe/laravel-typegen 的下载量有多少?

根据 npm 官方下载统计,@7nohe/laravel-typegen 在 2026/10/05 – 2026/11/03 这 30 天内被下载 6,395 次,日均约 213 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@7nohe/laravel-typegen 还在维护吗?

最新版本 0.6.1 发布于 2024/07/22(2 年前);至今共发布 25 个版本,其中过去 12 个月发布了 0 个;首次发布于 2022/11/21。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。