array.push 缺少类型中的以下属性

Posted

技术标签:

【中文标题】array.push 缺少类型中的以下属性【英文标题】:array.push is missing the following properties from type 【发布时间】:2022-01-11 15:28:12 【问题描述】:

我在 IONIC 中的注册页面有问题。

现在我正在使用存储所有数据的 data.json 文件,我想在这里创建另一个用户(成员)。为了创建一个成员,我只需要一些用户信息(姓名、邮件和密码),但用户信息存在更多数据。

我得到的错误是我的 arrayPush 缺少以下属性(我还不想添加,而是留空)。

这是我的 TS

import Component, Input, AfterViewInit, Output, OnInit from '@angular/core';
import  async  from '@angular/core/testing';
import  Router  from '@angular/router';
import AlertController, ModalController, NavParams from '@ionic/angular';
import data from '../../../../data.json'

@Component(
  selector: 'app-register',
  templateUrl: './register.page.html',
  styleUrls: ['./register.page.scss'],
)
export class RegisterPage implements OnInit 
  @Input() fullName = '';
  @Input() email = '';
  @Input() password = '';
  @Input() repeatPassword = '';

  messageString: string;
  today = new Date();

  constructor(private router: Router, private alertController: AlertController) 
  

  ngOnInit() 

  onRegister() 
    //Grab data from HTML inputs and check if valid. If not popup.
    if (this.fullName === '') this.messageString = "You didn't enter a name.";this.errorMessage();return;
    if (this.email === '') this.messageString = "You didn't enter an mail address.";this.errorMessage();return;
    if (this.password === '') this.messageString = "You didn't enter a password.";this.errorMessage();return;
    if (this.password != this.repeatPassword) this.messageString = "The passwords don't match.";this.errorMessage();return;

    var firstname = this.fullName.split(" ")[0];
    var lastname = this.fullName.split(" ").pop();
    
    //save all data to JSON
    (data).members.push( 
      fullname: this.fullName,
      firstname: firstname,
      lastname: lastname,
      mail: this.email,
      password: this.password,
    );
    
    //Redirect to homepage.
    this.router.navigateByUrl('/home').then(r => );
  
  
  // Alert emails dont match
  async errorMessage() 
    const alert = await this.alertController.create(
      cssClass: 'alerts',
      header: 'ERROR',
      message: this.messageString,
      buttons: [
        
          text: 'Okay',
          cssClass: 'yes'
        
      ]
    );
    await alert.present();
  


这是我的 data.json


  "members": [
    
      "id": 1,
      "gender": "0",
      "fullname": "X X",
      "firstname": "X",
      "infix": "",
      "lastname": "X",
      "number": "06-12345678",
      "mail": "user@company.com",
      "image": "https://pbs.twimg.com/media/EHMN4bVWoAUXhUz.jpg",
      "password": "admin1",
      "birthdate": "14-07-2001",
      "country": "Netherlands",
      "address": "Testweg 1a",
      "state": "Noord Holland",
      "city": "Amsterdam",
      "zip": "1234BC",
      "subscription": "26 Dec. 2020"
    
  ]

到目前为止,我只想为新用户填充以下 JSON 对象 全名、名、姓、电子邮件、密码

【问题讨论】:

与您的问题没有真正的关系,但是您将无法仅通过推送到数组来更改文件系统中的 JSON 文件...实际上我认为没有出于安全原因,修改文件内容的方法。 【参考方案1】:

前言:我不完全确定代码的总体意图是什么,但下面的答案涉及您提到的类型问题。但是显示的代码推送到最初从data.json 读取的数据数组,并且(在显示的代码中)似乎没有将该数组保存在任何地方。与JSON Derulo points out 一样,推送到该数组对data.json 文件没有影响,只是内存中的数组。


听起来 TypeScript 是从 data.json 推断 data 的类型,因为您没有明确给出类型。 TypeScript 不会(不能)推断出一个属性应该是可选的。为此,您必须指定它。

有几种方法可以做到这一点。

自己在类型定义中列出所有属性。 列出类型定义中的所有可选属性,以便推断其他(必需的)属性。 在类型定义中列出所有必需的属性,以便推断其他(可选)属性。

其中,最后一个似乎对您的描述最有用:

import sampleData from "../../../../data.json";

type MemberType =
    Partial<typeof sampleData["members"][number]>
    & Pick<
        typeof sampleData["members"][number],
        "fullname" | "firstname" | "lastname" | "mail" | "password"
    >;

const data: typeof sampleData & members: MemberType[] = sampleData;

Playground link

这让 TypeScript 可以从 data.json 推断类型,但随后我们将所有属性设为可选,然后用其原始的非可选定义覆盖应该需要的属性。

【讨论】:

以上是关于array.push 缺少类型中的以下属性的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 错误类型“”缺少类型中的以下属性

与 Typescript 反应 - 类型 缺少类型中的以下属性

如何修复 Typescript 中的“以下属性中缺少类型''...”错误?

类型错误:无法添加属性 1,对象不可扩展↵ 在 Array.push (<anonymous>)

类型“订阅”缺少类型“可观察<StringMap<any>>”中的以下属性

VS Code 中的 Vue Array Prop JSDoc TypeScript 错误:“ArrayConstructor”类型缺少“MyCustomType []”类型中的以下属性