jpnut / laravel-typescript-codegen
Laravel的TypeScript代码生成
Requires
- php: ^7.4|^8.0
- ext-json: *
- illuminate/contracts: ^8.0
- illuminate/routing: ^8.0
- illuminate/support: ^8.0
- phpdocumentor/reflection-docblock: ^5.0
Requires (Dev)
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.1
README
此包允许您通过从您的Laravel路由和控制器获取类型信息来生成typescript模式。
例如,您可以将这个
// routes/web.php ... Route::delete('/foo/{foo}', FooController::class.'@delete')->name('foo.delete'); ...
// App\Controllers\Web\FooController ... /** * @code-gen */ public function delete(Request $request, Foo $foo): bool { return $foo->delete(); } ...
转换成这个
export const fooDeleteRequest = (foo: string, options?: RequestInit) => request<bool>(`https:///foo/${foo}`, { method: `DELETE`, ...options });
安装
您可以通过composer安装此包
composer require jpnut/laravel-typescript-codegen
使用方法
要生成模式,使用带有所需文件位置的生成命令,位置作为唯一参数
php artisan code-gen:generate schema.ts
为了生成给定路由的函数,您必须在控制器方法(由路由使用)的文档块中添加@code-gen
标签。
... /** * @code-gen */ public function delete(Request $request, Foo $foo): bool ...
这将尝试从文档块的@return
标签获取返回类型信息,或者如果没有,则使用方法的返回类型。如果没有类型信息,则返回类型默认为any
。
标量类型(例如 string
、int
等)将转换为相应的typescript标量(例如 string
、number
等)。如果方法返回一个类,则该类将被转换为一个包含所有公共属性的接口。
例如,给定以下类
// App\Objects\User ... class User { public string $name; public int $age; /** * App\Object\Token[] */ public array $tokens; }
生成的接口将如下所示
interface User { name: string; age: number; tokens: Token[]; } interface Token { ... }
与请求一起工作
为请求属性(例如请求正文)生成类型稍微复杂一些。请求必须实现JPNut\CodeGen\Contracts\CodeGenRequest
,并且应该由Laravel的服务容器解析(通常这意味着扩展Illuminate\Foundation\Http\FormRequest
)。然后,您应该创建并标记将请求映射到所需类型的方法。例如
// App\Requests\UpdateUserRequest ... class UpdateUserRequest extends FormRequest { /** * @code-gen-property body */ public function data(): UpdateUserParams { return new UpdateUserParams([ 'name' => $this->input('name'), 'age' => $this->input('age'), ]); } }
// App\Objects\UpdateUserParams ... class UpdateUserParams { ... public ?string $name; public ?int $age; }
在这种情况下,生成的接口和方法将如下所示
interface UpdateUserRequest { body: UpdateUserParams; } interface UpdateUserParams { name?: string | null; age?: number | null; } export const fooUpdateRequest = ({ body }: UpdateUserRequest, foo: string, options?: RequestInit) => request<any>(`https:///foo/${foo}`, { method: 'PUT', body: JSON.stringify(body), ...options });
请注意,正文参数会自动序列化请求。您可以通过修改request_properties
配置属性来更改此操作或序列化其他属性。
忽略属性
您可能有一些您不希望为其生成类型的公共属性。可以通过包含@code-gen-ignore
标签来忽略属性
class Foo { /** * @code-gen-ignore */ public string $ignored_property; }
使用自定义存根
默认情况下,此包将使用存根生成模式。此存根包含一个request
方法,它是fetch api的包装,并返回包含反序列化响应数据的promise。
如果您希望自定义此存根,首先应发布配置文件
php artisan vendor:publish --provider="JPNut\CodeGen\CodeGenServiceProvider" --tag="config"
这将创建一个默认存根文件的副本,位于resource_path('stubs/typescript-codegen-schema.stub')
。然后,将使用此文件生成模式。
使用自定义接口/方法编写器
您可能希望更改生成的接口和方法的输出。例如,您可能决定更改存根中request
方法的名称。在这种情况下,您应该创建自己的接口或方法编写器,并用您的版本替换配置中的包含编写器。编写器应分别实现JPNut\CodeGen\Contracts\InterfaceWriterContract
和JPNut\CodeGen\Contracts\MethodWriterContract
接口。
覆盖类解析
您可能希望将某些类解析为字面量。这对于不是您的代码库中的类特别有用。为此,请在配置中的default_literals
数组中包含类。类名应该是键,值应该是一个PHP字面量类型数组(例如 string、int 等)。
例如,默认情况下,此包将Carbon\Carbon
类转换为字符串。这是必要的,因为类的jsonSerialize
方法的返回类型是string|array
。
测试
vendor/bin/phpunit
许可证
麻省理工学院许可证(MIT)。更多信息请参阅许可文件。