【问题标题】:TypeScript casting json array [duplicate]TypeScript强制转换json数组[重复]
【发布时间】:2017-06-16 17:20:38
【问题描述】:

我有如下 JSON 数组:

   var json = [{
            id: 1,
            login: "Mieszko",
            name: "Misztal",
            surname: "Adminek",
            phone: "0413414",
            role: 2
            },
            {
                id: 2,
                login: "Rafal",
                name: "Robak",
                surname: "Kierowczek",
                phone: "5145145",
                role: 1
            }
        ];

我还创建了如下的用户类:

export class User extends BaseModel {
    id: number;
    login: string;
    name: string;
    surname: string;
    phone: string;
    roles: Roles;
    admin: boolean;
    driver: boolean;

isDriver(): boolean {
        return this.roles === 1;
    }
//other methods

}

我的计划是将传入的 JSON 数组转换为用户数组。在 JSON 中,我将角色作为整数。我的班级中有管理员和驱动程序布尔字段。这在 ngModel 中需要用于复选框。

现在问题出在这一行之后

var users: Array<User> = JSON.parse(JSON.stringify(json));

我无法从 User 类调用方法,例如 users[0].isDriver(),因为编译器无法识别 isDriver() 方法。

有人知道怎么解决吗?

【问题讨论】:

  • 那个数组怎么是 JSON 数组???它可以是一个数组,也可以是 JSON 格式的数据。对我来说,这看起来很像一个数组,不管你把保存它的变量叫做什么......
  • 这不是重复的。编辑们再次急于获得新的 SO 徽章,而不是对问题进行属性确认。链接中作为唯一问题提出的问题没有答案。

标签: typescript


【解决方案1】:

TypeScript 类型断言

TypeScript 允许您以任何您想要的方式覆盖其推断和分析的类型视图。这是通过一种称为“类型断言”的机制完成的。

类型断言有两种形式。一种是“尖括号”语法:

let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;

另一个是as-syntax:

let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;

回答这个问题

在您的情况下,问题不在于类型断言。您正在尝试将纯 JSON 对象数组分配给 users 变量,然后尝试调用对象上不存在的方法(users[0].isDriver 未定义)。

您不能简单地将普通对象转换为 JavaScript/TypeScript 类实例。您必须先实例化一个用户。有许多技术可以做到这一点,通常涉及复制数据。

有关将 JSON“转换”为 TS 类实例的示例解决方案,请参阅以下答案之一:

  1. https://stackoverflow.com/a/22886730/6103920
  2. https://stackoverflow.com/a/29759472/6103920

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2014-06-11
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多