繁体   English   中英

打字稿联合类型不起作用

[英]Typescript union type not working

我有以下课程:

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;
}

在某些时候,我想迭代成员的arroy,如下例所示:

        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类型。

谢谢。

您需要进行一些类型检查和转换来处理这种情况:

(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的类型以查看它是否为数字,然后有条件地进行比较。

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;

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.uservar memberUser = <ISimpleUser> member.user;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM