typescript 联合类型不起作用

标签 types typescript typescript1.4

我有以下类(class):

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'

不知 Prop 体是什么问题。我看到代码的其他部分使用联合类型。

谢谢。

最佳答案

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

(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 联合类型不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30621139/

相关文章:

c# - 迭代对象列表时避免多个 "if"语句 c#

java - 用于 Java 中看起来很奇怪的显式类型参数声明语法

javascript - Angular 6 类型错误 : guard is not a function

javascript - 如何在不使用@angular/router 的情况下添加查询参数

javascript - 有没有 ? ("safe operator") Typescript 中的替代方法来处理空值?

requirejs - 加载typescript模块依赖的三种方式有什么区别?

visual-studio - 浏览器中 TypeScript 的模块化故事是什么?

javascript - Visual Studio 在 TypeScript 中显示错误的 `this` 值

variables - 什么类型的变量包含一个范围?

python - 具有不同基础的同一模块中的两个同名类?