错误 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您可能不喜欢这种用法,但如果您不需要 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
,但在您的用户列表中,您只有firstName
和lastName
,但没有关联函数,用户类型为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:类型中缺少属性的主要内容,如果未能解决你的问题,请参考以下文章
反应钩子形式 - 类型错误:无法读取 L 处未定义的属性“拆分”(get.ts:6)
错误 TS2349:无法调用其类型缺少调用签名的表达式。类型 ' ; ' 没有兼容的调用签名