类型"{}"不能分配给类型'{title:string; text:string; }"

use*_*018 14 typescript angular

我收到以下TypeScript代码的错误,

类型'{}'不能分配给'{title:string; text:string; }"."{}"类型中缺少属性"标题".

因为我在下面声明"文章",

article: { title: string, text: string } = {};
Run Code Online (Sandbox Code Playgroud)

它是什么原因以及如何解决这个问题?谢谢!

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)!');
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Nit*_*mer 25

你告诉编译器article的类型的{ title: string, text: string },但那么你指定一个空的对象({}),同时缺少titletext,所以编译器会抱怨.

您可以使用类型断言告诉编译器它没问题:

let article: { title: string, text: string } = {} as { title: string, text: string };
Run Code Online (Sandbox Code Playgroud)

您还可以将其放入类型别名中:

type MyType = { title: string, text: string };
let article: MyType = {} as MyType;
Run Code Online (Sandbox Code Playgroud)

当你使用类型断言时,你可以简单地:

let article = {} as MyType;
Run Code Online (Sandbox Code Playgroud)

  • 这是完全错误的做法。在这种情况下,最好按照另一个答案中的建议将字段定义为可选。 (2认同)
  • 已经过去很长一段时间了,但对于未来的任何人来说,使用 `as` 仍然不理想。您会失去类型安全性,并且可能会在定义属性之前访问该属性,这完全是错误的做法。更好的是使用部分类型,然后在代码中定义属性后使用`as` (2认同)

Ale*_*nov 7

原因很简单,你声称article应该有titletext田地,但{}没有.如何解决它取决于你想要显示什么同时article具有初始值,但最简单的解决方法是使字段可选:{ title?: string, text?: string }.