1. ホーム
  2. angular

[解決済み] 型 '{}' は型 '{ title: string; text: string; }' に代入できません。

2022-01-31 09:31:48

質問

以下のTypeScriptのコードで、以下のエラーが発生します。

<ブロッククオート

タイプ '{}' はタイプ '{ title: string; text: string; }' に割り当てることができません。プロパティ 'title' がタイプ '{}' にありません。

私は以下のように記事を宣言しています。

article: { title: string, text: string } = {};

その理由と解決方法を教えてください。ありがとうございました。

import { Component } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';

@Component({
    selector: 'article-editor',
    template: `
    <p>Title: <input [formControl]="titleControl"></p>
    <p>Text: <input [formControl]="textControl"></p>
    <p><button (click)="saveArticle()">Save</button></p>
    <hr />
    <p>Preview:</p>
    <div style="border:1px solid #999;margin:50px;">
      <h1>{{article.title}}</h1>
      <p>{{article.text}}</p>
    </div>
  `
})
export class ArticleEditorComponent {
    article: { title: string, text: string } = {};

    titleControl: FormControl = new FormControl(null, Validators.required);
    textControl: FormControl = new FormControl(null, Validators.required);
    articleFormGroup: FormGroup = new FormGroup({
        title: this.titleControl,
        text: this.textControl
    });

    saveArticle() {
        if (this.articleFormGroup.valid) {
            this.article = this.articleFormGroup.value;
        } else {
            console.log('Missing field(s)!');
        }
    }
}

解決方法は?

コンパイラに article は、型 { title: string, text: string } が、空のオブジェクトを割り当てた場合( {} の両方を欠いたものです。 titletext というように、コンパイラが文句を言う。

タイプアサーションを使って、コンパイラに大丈夫だと伝えることができます。

let article: { title: string, text: string } = {} as { title: string, text: string };

また、それを型の別名に入れることもできます。

type MyType = { title: string, text: string };
let article: MyType = {} as MyType;

そして、タイプアサーションを使用しているので、単純にできます。

let article = {} as MyType;