Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 错误TS2741:类型中缺少属性_Angular_Typescript_Methods_Angular7 - Fatal编程技术网

Angular 错误TS2741:类型中缺少属性

Angular 错误TS2741:类型中缺少属性,angular,typescript,methods,angular7,Angular,Typescript,Methods,Angular7,在文件models/User.model.ts(见下文)中,我尝试将方法设置为相等,如下面的代码所示。 有人能纠正我的密码吗 文件models/User.model.ts: export class User { constructor( public firstName: string, public lastName: string, ) {} isEqual (other : User): boolean { return other ==

在文件models/User.model.ts(见下文)中,我尝试将方法设置为相等,如下面的代码所示。 有人能纠正我的密码吗

文件models/User.model.ts:

export class User {
    constructor(
    public firstName: string,
    public lastName: string,
    ) {}

    isEqual (other : User): boolean {
    return other === this;
    }
}
文件服务/user.service.ts:

import { User } from '../models/User.model';
import { Subject } from 'rxjs/Subject';

export class UserService {

    private users: User[] = [
    {
        firstName: 'William',
        lastName: 'Jones'
    },
    {
        firstName: 'John',
        lastName: 'Doe'
    }
    ];

services/user.service.ts(7,2)中出错:错误TS2741:类型“{firstName:string;lastName:string;}”中缺少属性“isEqual”,但类型“user”中需要此属性

services/user.service.ts(7,2)中出错:错误TS2741:类型“{firstName:string;lastName:string;}”中缺少属性“isEqual”,但类型“user”中需要此属性

这是因为在类定义中,您将函数声明为
isEqual
,但在用户列表中,您只有
firstName
lastName
,而没有关联函数,并且用户类型为
users

{
  firstName: 'William',
  lastName: 'Jones'
},
如注释中所述,您可以使用
new()
创建一个新的
用户
,该用户还应包含该函数

public exampleUser = new User("William", "Jones");
然后,这可以反过来用于
用户的数组中

public users: Users =  [ this.exampleUser ];

它指定您在函数
isEqual
中使用的参数的类型或模型应为
{firstName:'John',lastName:'Doe'}
,这表明您只需要以这种格式传递数据。

由于添加了对
部分的支持,您现在可以将User的构造函数更改为以下格式,您应该能够通过指定键和值的部分散列来初始化对象(正如您在上面尝试的那样)

构造函数(初始化?:部分){
赋值(this,init);
}
从文件(目前位于):

构造一个类型,将T的所有属性设置为可选。此实用程序将返回一个表示给定类型的所有子集的类型


您可能不喜欢这种用法,但如果不需要对数组中的项使用
isEqual
,则可以将该方法设置为可选的

向方法名称添加问号(?)

isEqual?(other: User): boolean

但是,如果您需要对所有项目进行
isEqual
,那么这个解决方案将不会像我在开始时所说的那样帮助您。通过这种用法,当您尝试使用
isEqual
方法时,它将给出
未定义的
错误。

您不能只说
{firstName:'John',lastName:'Doe'}
用户,因为它不是。您需要
新用户('john','doe')
@ErikPhilips这是非常不幸的,也是我对TypeScript的一个不满。其他语言处理这个问题没有问题syntax@nuzzolilo还有哪些语言支持在不指定/调用构造函数的情况下创建对象?@ErikPhilips撇开是否调用默认构造函数的语义(这不是问题所在):JS、C#、F#、Java、C99、C++20(通过指定的初始值设定项)、Python、,现在,我能想到的只是部分的TS。我添加了一个答案,说明了如果更改构造函数是一个选项,如何使用TS执行此操作。@nuzzolilo我请求对默认构造函数有所不同。在功能上,如果不调用new,就无法完成许多事情。与文章中的大多数(如果不是所有的话)相关语言一样,构建用户定义的类需要新语言。虽然有一些方法可以避免调用构造函数(比如c#),但除了一些主要的例外情况外,它很少被使用。我不明白我应该在代码中的什么地方编写这个新用户。你能更明确一点吗?你可以选择公共用户:用户=[新用户(“约翰”,“多伊”),新用户(“威廉”,“琼斯”)];etc:-)这有助于解决您的问题吗?非常感谢。现在,方法isEqual得到了正确的解释。我照你说的做了:
publicwj=新用户('William','Jones');public ep=新用户(“John”,“Doe”);public users=[this.wj,this.jd];
我不知道如何投票,也不知道如何在评论中添加新行。对不起。无论如何,你帮了我很多忙。
isEqual?(other: User): boolean