Types 类型脚本联合类型不工作

Types 类型脚本联合类型不工作,types,typescript,typescript1.4,Types,Typescript,Typescript1.4,我有以下课程: 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[]; abo

我有以下课程:

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;
}
不知道到底出了什么问题。我看到代码的其他部分使用联合类型


谢谢。

键入TypeScript(和JavaScript)的
编号没有
id
属性。若要在未进行保护类型检查的情况下对联合类型使用属性(若要取消联合类型),属性必须具有相同的名称和类型。例如,如果
user
属性的定义如下:

user: IOtherThing|ISimpleUser;
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;
IOtherThing
有一个
id
属性,那么它就可以工作了

我猜,但你可能必须这样做:

user: IOtherThing|ISimpleUser;
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;
var getId=(id:number | IMember)=>{
如果(id的类型==“编号”){
返回id;
}否则{
返回id.id;
}
};
返回angular.forEach(this.project.members,
(成员:resources.IMember)=>{
返回getId(member.user.id)==getId(user);
}).长度>0;

Typescript不知道如何处理
成员。用户
在您的foreach中,您需要将逻辑放入
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;
返回angular.forEach(this.project.members,(成员:resources.IMember)=>{
var memberUser=member.user;
如果(成员的类型用户==='number'){
返回memberUser===user.id;
}else if(typeof member.user=='object'){
return memberUser.id==user.id;
}
}).长度>0;
通过使用
typeof
TypeScript可以推断出在哪一点要使用哪种类型


或者,如果您知道您的列表仅包含
ISimpleUser
,则可以强制转换
成员.user
,即
var memberUser=member.user

您需要执行一些类型检查和强制转换来处理此场景:

(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;
(成员:resources.IMember)=>{
返回member.user.id==user.id;
if(typeof(member.user)==“number”){
返回member.user==user.id;
}否则{
return(member.user).id==user.id;
}
}).长度>0;

仅仅因为您在代码/设计时知道可能的类型,并不意味着编译代码在运行时知道类型。因此,您可以检查
member.user
的类型,查看它是否是一个数字,然后有条件地进行比较。

如果user是一个数字,则此代码将不起作用
getId(member.user.id)
,因为数字上的id没有属性。这非常好。谢谢。