错误 TS2741:类型中缺少属性

Posted

技术标签:

【中文标题】错误 TS2741:类型中缺少属性【英文标题】:error TS2741: Property is missing in type 【发布时间】: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#),但它很少使用,除了一些主要的例外。 【参考方案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]; 我不知道如何投票,也不知道如何在评论中换行。对不起。不管怎样,你帮了很多忙。

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

Reactj,类型中缺少打字稿属性'setState'

反应钩子形式 - 类型错误:无法读取 L 处未定义的属性“拆分”(get.ts:6)

错误TS2322:类型“对象”不能分配给“联系人”类型。角

错误 TS2349:无法调用其类型缺少调用签名的表达式。类型 ' ; ' 没有兼容的调用签名

react+ts 项目:引入antd select组件联动 ,ts7053ts2741报错解决

TypeScript 项目中缺少基本的 DOM 类型