【前提】
Angularの初学者です。typescript自体も初めてさわる段階です。
現在、書籍で学習しており、フォームのバリデーション を学習中なのですが、タイトルのエラーを解決できない状態です。下記のような症状ですが、どのような原因が考えられるかアドバイス頂けないでしょうか。宜しくお願い致します。
【開発環境】
angular:12
os:MAC
【現在の状況】
下記のようなエラーが出ている状態です。
(全ての)プロパティを定義している箇所でエラーがでています。内容としては、コンストラクタで初期化していないですよ言っているかと思われます。
【やってみたこと】
・ tsconfig.json
に"strictPropertyInitialization": false
を追記してみる。
⇨症状は全く変わらず。
・ string→anyに変えてみる
⇨とりあえずエラーは消えるが根本解決になっていない気がする。
・ title!: string;
ようにプロパティの後ろに!
をつけてみる。
⇨別のエラーが出る。(ややこしくなるのでひとまず割愛)
・ title: string | undefined;
としてみる。
⇨別のエラーが出る。(ややこしくなるのでひとまず割愛)
参考にしたサイト
http://one-way.tech/programing/basic-typescript/
https://tech-up.hatenablog.com/entry/2019/03/15/152258
※エラーメッセージ ✔ Browser application bundle generation complete. Lazy Chunk Files | Names | Size src_app_registration_registration_module_ts.js | - | 12.29 kB 6 unchanged chunks Build at: 2021-08-22T02:56:59.731Z - Hash: c222efc48625979724c3 - Time: 728ms Error: src/app/registration/registration.component.ts:15:3 - error TS2564: Property 'title' has no initializer and is not definitely assigned in the constructor. 15 title: string; ~~~~~ Error: src/app/registration/registration.component.ts:16:3 - error TS2564: Property 'message' has no initializer and is not definitely assigned in the constructor. 16 message: string; ~~~~~~~ Error: src/app/registration/registration.component.ts:17:3 - error TS2564: Property 'myControl' has no initializer and is not definitely assigned in the constructor. 17 myControl: FormGroup; ~~~~~~~~~
コード
※基本的には教本のコピペです。
typescript
1//registration.component.ts 2import { Component, OnInit } from '@angular/core'; 3import { 4 FormControl, 5 FormGroup, 6 FormBuilder, 7 Validators, 8} from '@angular/forms'; 9 10@Component({ 11 selector: 'app-registration', 12 templateUrl: './registration.component.html', 13 styleUrls: ['./registration.component.scss'], 14}) 15export class RegistrationComponent implements OnInit { 16 title: any; 17 message: any; 18 myControl: FormGroup; 19 constructor(private fb: FormBuilder) {} 20 21 ngOnInit() { 22 this.title = 'Hello-app'; 23 this.message = 'FormControlを使う'; 24 this.myControl = this.fb.group({ 25 name: ['', [Validators.required]], 26 mail: ['', [Validators.email]], 27 age: [0, [Validators.min(1), Validators.max(150)]], 28 }); 29 } 30 31 get name() { 32 return this.myControl.get('name'); 33 } 34 get mail() { 35 return this.myControl.get('mail'); 36 } 37 get age() { 38 return this.myControl.get('age'); 39 } 40 41 onSubmit() { 42 if (this.myControl.invalid) { 43 this.message = 'VALIDATION ERROR.'; 44 } else { 45 let result = this.myControl.value; 46 this.message = JSON.stringify(result); 47 } 48 } 49} 50
html
1// registration.component.html 2<h1>新規会員登録画面</h1> 3<form [(formGroup)]="myControl" (ngSubmit)="onSubmit()"> 4 <table> 5 <tr> 6 <th>Name</th> 7 <td> 8 <div *ngIf="name.invalid">Nameは必須項目です.</div> 9 <div><input type="text" formControlName="name" /></div> 10 </td> 11 </tr> 12 <tr> 13 <th>Mail</th> 14 <td> 15 <div *ngIf="mail.invalid">メールアドレスが必要です.</div> 16 <div><input type="text" formControlName="mail" /></div> 17 </td> 18 </tr> 19 <tr> 20 <th>age</th> 21 <td> 22 <div *ngIf="age.invalid">1歳以上150歳以下で入力下さい..</div> 23 <input type="number" formControlName="age" /> 24 </td> 25 </tr> 26 <tr> 27 <th></th> 28 <td> 29 <input [disabled]="myControl.invalid" type="submit" value="click" /> 30 </td> 31 </tr> 32 </table> 33</form>
typescript
1// app.module.ts 2import { NgModule } from '@angular/core'; 3import { BrowserModule } from '@angular/platform-browser'; 4import { RouterModule, Routes } from '@angular/router'; 5import { 6 FormsModule, 7 ReactiveFormsModule, 8 FormGroup, 9 FormBuilder, 10 Validators, 11} from '@angular/forms'; 12 13import { AppRoutingModule } from './app-routing.module'; 14import { AppComponent } from './app.component'; 15import { TestComponent } from './test/test.component'; 16import { LoginComponent } from './login/login.component'; 17import { MypageComponent } from './mypage/mypage.component'; 18import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; 19import { MatSliderModule } from '@angular/material/slider'; 20import { MatButtonModule } from '@angular/material/button'; 21import { MatCardModule } from '@angular/material/card'; 22import { MatInputModule } from '@angular/material/input'; 23import { MatFormFieldModule } from '@angular/material/form-field'; 24import { MatIconModule } from '@angular/material/icon'; 25 26const ROUTE_TABLE: Routes = [ 27 { path: 'test', component: TestComponent }, 28 { path: 'login', component: LoginComponent }, 29 { path: 'mypage', component: MypageComponent }, 30]; 31 32@NgModule({ 33 declarations: [AppComponent, TestComponent, LoginComponent, MypageComponent], 34 imports: [ 35 BrowserModule, 36 AppRoutingModule, 37 FormsModule, 38 ReactiveFormsModule, 39 RouterModule.forRoot(ROUTE_TABLE), 40 BrowserAnimationsModule, 41 MatSliderModule, 42 MatButtonModule, 43 MatCardModule, 44 MatInputModule, 45 MatFormFieldModule, 46 MatIconModule, 47 FormGroup, 48 FormBuilder, 49 Validators, 50 ], 51 providers: [], 52 bootstrap: [AppComponent], 53}) 54export class AppModule {} 55
typescript
1// registration-routing.module.ts 2import { NgModule } from '@angular/core'; 3import { RouterModule, Routes } from '@angular/router'; 4import { RegistrationComponent } from './registration.component'; 5 6const routes: Routes = [{ path: '', component: RegistrationComponent }]; 7 8@NgModule({ 9 imports: [RouterModule.forChild(routes)], 10 exports: [RouterModule], 11}) 12export class RegistrationRoutingModule {} 13
typescript
1// registration.module.ts 2import { NgModule } from '@angular/core'; 3import { CommonModule } from '@angular/common'; 4import { FormBuilder, FormGroup } from '@angular/forms'; 5 6import { RegistrationRoutingModule } from './registration-routing.module'; 7import { RegistrationComponent } from './registration.component'; 8 9@NgModule({ 10 declarations: [RegistrationComponent], 11 imports: [CommonModule, RegistrationRoutingModule, FormBuilder, FormGroup], 12}) 13export class RegistrationModule {} 14