我有以下课程:
export interface ISimpleUser {
id: number;
full_name: string;
}
export interface IMember extends ng.resource.IResource<IMember> {
id: number;
project: number;
user: number|ISimpleUser;
skills: ISkill[];
about: string;
accepted: Boolean;
updated: Date;
created: Date;
}
在某些时候,我想迭代一些成员,如下例所示:
return angular.forEach<resources.IMember>(this.project.members,
(member: resources.IMember) => {
return member.user.id == user.id;
}).length > 0;
但是我收到了这个错误:
error TS2339: Property 'id' does not exist on type 'number | ISimpleUser'
不知道到底出了什么问题。我看到代码的其他部分使用了union类型。
感谢。
答案 0 :(得分:6)
您需要进行一些类型检查和转换才能处理这种情况:
(member: resources.IMember) => {
return member.user.id == user.id;
if (typeof (member.user) === 'number') {
return member.user == user.id;
} else {
return (<ISimpleUser>member.user).id == user.id;
}
}).length > 0;
仅仅因为您知道代码/设计时可能的类型并不意味着编译代码在运行时知道类型。因此,您可以检查member.user
的类型以查看它是否为数字,然后有条件地进行比较。
答案 1 :(得分:2)
TypeScript(和JavaScript)中的number
类型没有id
属性。要在联合类型上使用属性而不进行保护类型检查(以破坏联合类型),属性必须具有相同的名称和类型。例如,如果user
属性定义如下:
user: IOtherThing|ISimpleUser;
和IOtherThing
有一个id
属性,然后就可以了。
我猜,但你可能要做这样的事情:
var getId = (id: number | IMember) => {
if (typeof id === "number") {
return id;
} else {
return id.id;
}
};
return angular.forEach<resources.IMember>(this.project.members,
(member: resources.IMember) => {
return getId(member.user.id) === getId(user);
}).length > 0;
答案 2 :(得分:2)
Typescript不知道如何在你的foreach中处理member.user
,你需要将逻辑放在typeof if
语句中:
return angular.forEach<resources.IMember>(this.project.members, (member: resources.IMember) => {
var memberUser = member.user;
if(typeof memberUser === 'number'){
return memberUser === user.id;
} else if (typeof member.user === 'object') {
return memberUser.id === user.id;
}
}).length > 0;
使用typeof
TypeScript可以推断出您想在哪个类型使用。
或者,如果您知道自己的列表中只包含ISimpleUser
,那么您可以投放member.user
,即var memberUser = <ISimpleUser> member.user;