【问题标题】:error TS2741: Property is missing in type错误 TS2741:类型中缺少属性
【发布时间】:2019-10-30 18:40:28
【问题描述】:

在文件 models/User.model.ts(见下文)中,我尝试设置方法 isEqual,如下面的代码所示。 有人可以更正我的代码吗?

文件模型/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'
    }
    ];

...

服务/user.service.ts(7,2) 中的错误:错误 TS2741:类型“{ firstName: string;”中缺少属性“isEqual” lastName: string;}' 但在“用户”类型中是必需的。

【问题讨论】:

  • 你不能只说{ firstName: 'John', lastName: 'Doe' }User,因为它不是。你需要new User('john', 'doe');
  • @ErikPhilips 这很不幸,也是我对 TypeScript 的不满之一。其他语言处理该语法没有问题
  • @nuzzolilo 还有哪些其他语言支持在不指定/调用构造函数的情况下创建对象?
  • @ErikPhilips 撇开是否调用默认构造函数的语义(这不是问题):JS、C#、F#、Java、C99、C++20(通过指定的初始化程序)、Python 以及现在通过 Partial 的 TS 只是我能想到的一些。如果可以选择更改构造函数,我添加了一个答案,显示如何使用 TS 执行此操作。
  • @nuzzolilo 我希望对默认构造函数有所不同。 new operator 在功能上做了很多不调用 new 是不可能的事情。与您帖子中的大多数(如果不是所有)相关语言一样,new 是构造用户定义类的必需。虽然可能有一些方法可以避免调用构造函数(如 c#),但它很少使用,除了一些主要的例外。

标签: angular typescript methods angular7


【解决方案1】:

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

在方法名中添加问号(?)

isEqual?(other: User): boolean

但是,如果您的所有项目都需要isEqual,那么正如我在开头所说的那样,此解决方案对您没有帮助。通过这种用法,当你尝试使用isEqual 方法时,它会给出undefined 错误。

【讨论】:

    【解决方案2】:

    由于添加了对Partial<T> 的支持,您现在可以将 User 的构造函数更改为以下内容,并且您应该能够通过指定键和值的部分哈希来初始化对象(正如您在上面尝试的那样) .

    constructor(init?:Partial<User>) {
        Object.assign(this, init);
    }
    

    来自文档(目前在https://www.typescriptlang.org/docs/handbook/utility-types.html#partialt):

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        服务/user.service.ts(7,2) 中的错误:错误 TS2741:类型“{ firstName: string;”中缺少属性“isEqual” lastName: string;}' 但在“用户”类型中是必需的。

        这是因为在您的类定义中,您声明了函数isEqual,但在您的用户列表中,您只有firstNamelastName,但没有关联函数,用户类型为Users .

        {
          firstName: 'William',
          lastName: 'Jones'
        },
        

        如 cmets 中所述,您可以使用 new () 创建一个新的 User,其中还应包含该函数。

        public exampleUser = new User("William", "Jones");
        

        这又可以用在Users的数组中

        public users: Users =  [ this.exampleUser ];
        

        【讨论】:

        • 我不明白我应该在代码中的哪个位置编写这个新用户。你能说得更清楚些吗?
        • 你可以使用公共用户:Users = [ new User("john", "Doe"), new User("william", "jones")];等:-)
        • 这对您解决问题有帮助吗?
        • 非常感谢。现在方法 isEqual 被正确解释了。我照你说的做了:public wj = new User ('William', 'Jones'); public ep = new User (''John", "Doe"); public users = [this.wj, this.jd];
        • 我不知道如何投票,也不知道如何在评论中换行。对不起。不管怎样,你帮了很多忙。
        猜你喜欢
        • 2022-11-16
        • 2021-08-26
        • 2019-06-25
        • 2017-02-15
        • 1970-01-01
        • 1970-01-01
        • 2017-11-10
        • 2019-11-19
        • 2020-05-23
        相关资源
        最近更新 更多