LoginSignup
3
2

More than 3 years have passed since last update.

AngularのReactive Formsに型を追加する ngx-type-safe-reactive-form を公開しました

Posted at

こんにちは。
みなさん、AngularのReactive Formsは使ってますか?

僕は仕事でも活用していて、めっちゃお世話になっています。
めっちゃ便利ですよね、Reactive Forms。
しかし、こんなことありませんか?

フォームのvalueにアクセスするとき、型が欲しい~~~~

valueChangeをsubscribeしたときに型がないのつれぇ~~~~

FormGroupの子フォームにcontrolsでアクセスしたらタイポして実行時に怒られた。。。

これらは全部僕の体験談ですが、同じ苦しみを感じているのは僕だけではないはず!

ということで、Reactive Formsに型を追加したngx-type-safe-reactive-formというライブラリをnpmで公開しました。

※念のため、弊社ブログにも全く同じ記事がありますが、コピーコンテンツではなく同一著者です。

対象読者

AngularのReactive Formsを使っているけど、型がなくて辛い人

使い方

リポジトリに使い方は書いていますが、一応こちらでも書いておきます。

インストールします。

npm install --save ngx-type-safe-reactive-form

もし ReactiveFormsModule をインポートしていない場合は、インポートします。

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { ReactiveFormsModule } from '@angular/forms';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    ReactiveFormsModule,
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

コンポーネントを書いていきます。
ほとんど通常のReactive Formsと同じですが、FormBuilderの代わりにTypeSafeFormBuilderを使用しています。
TypeSafeFormBuilderの使い方はFormBuilderと同じです。

import { Component } from '@angular/core';
import { TypeSafeFormBuilder } from 'ngx-type-safe-reactive-form';

@Component({
  selector: 'app-root',
  template: `
  <form [formGroup]="form" (submit)="submit()">
    <input placeholder="Username" formControlName="username">
    <input type="password" placeholder="Password" formControlName="password">
    <input type="checkbox" formControlName="rememberMe">
    <button type="submit">Output console</button>
  </form>
  `,
  styles: []
})
export class AppComponent {

  readonly form = this.formBuilder.group({
    username: '',
    password: '',
    rememberMe: false,
  });

  constructor(
    private formBuilder: TypeSafeFormBuilder,
  ) { }

  submit() {
    const { username, password, rememberMe } = this.form.value;

    console.log(
      `Username: ${username}\n` +
      `Password: ${password}\n` +
      `Remember me: ${rememberMe}`
    );
  }

}

以下のとおり、ちゃんと型が効いています。

capture.gif

今回の例だとrememberMeboolean型ではなくfalseになっているので、必要であれば型アサーションを使用します。

    // as booleanを追加する
    rememberMe: false as boolean,
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2