Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 动态选择要从中创建对象的类_Javascript_Typescript - Fatal编程技术网

Javascript 动态选择要从中创建对象的类

Javascript 动态选择要从中创建对象的类,javascript,typescript,Javascript,Typescript,我目前正在尝试基于从ajax调用获得的json创建一个对象。看起来是这样的: { "users": [ { "address": { "city": "testCity", "houseNumber": 69, "id": 1, "postcode": 420, "street":

我目前正在尝试基于从ajax调用获得的json创建一个对象。看起来是这样的:

{
    "users": [
        {
            "address": {
                "city": "testCity", 
                "houseNumber": 69, 
                "id": 1, 
                "postcode": 420, 
                "street": "testStreet"
            }, 
            "email": "testEmail@test.de", 
            "gender": "male", 
            "id": 3, 
            "isAdmin": false, 
            "lastname": "testLastname", 
            "prename": "testPrename", 
            "projects": [
                {
                    "archived": null, 
                    "files": [], 
                    "id": 1, 
                    "name": "testProject", 
                    "timestamp": "2017-01-27T20:23:06+00:00", 
                    "uri": "http://localhost:2000/api/projects/1"
                }
            ], 
            "uri": "http://localhost:2000/api/users/3"
        }
    ]
}
我在User类中定义了一个静态方法,用于根据该输入创建User类型的对象。我要寻找的是一种创建Project和Address类对象的方法,并将它们设置为User类中相应的字段。这就是我目前拥有的:

export class User {
    public uri: string = undefined;
    public id: number = undefined;
    public readonly isAdmin: boolean = undefined;

    public prename: string = undefined;
    public lastname: string = undefined;
    public gender: string = undefined;
    public email: string = undefined;
    private password: string = undefined;

    public address: Address = undefined;
    public projects: Project[] = undefined;

    constructor() {

    }

    // Returns an array containing one or more User objects
    public static load(res: Response): User[]{
        let data: Object = res.json();
        let users: User[] = [];

        // Payload contains multiple Users (array)
        if(data.hasOwnProperty('users')){
            let dataUsers: Object[] = data['users'];

            for(let dataUser of dataUsers){
                let user = new User();

                for(let key in user){
                    if(dataUser.hasOwnProperty(key)){
                        if(typeof dataUser[key] === 'object'){
                            // If it's an object, find the class that matches the 'content' of the object and call their load method 
                            }
                        } else {
                            user[key] = dataUser[key];
                        }
                    }
                }

                users.push(user);
            }
        // Payload contains a single User
        } else if(data.hasOwnProperty('user')){
            let dataUser = data['user'];
            let user = new User();

            for(let key in user){
                if(data.hasOwnProperty(key)){
                    user[key] = dataUser[key];
                }
            }

            users.push(user);
        } else {
            users.push(new User());
        }

        return users;
    }

一种方法是通过检查键是“Projects”还是“Address”来硬编码Address和Projects的对象创建,但我正在寻找一种更“动态”的方法来点它。

您可以将加载函数存储在地图中。它看起来像这样

class Address {
    static load(data:Object) {
        //...
    }
}

class Project {
    static load(data:Object) {

    }
}

let keyClassMap : { [id:string]: (data:Object) => any } = {
    address: Address.load,
    project: Project.load,
}
此对象的键是与您感兴趣的类定义相对应的键

然后在你的声明中,你可以做:

if(typeof dataUser[key] === 'object'){
    user[key] = keyClassMap[key](dataUser[key]);
}

谢谢你的回答!上述加载功能在所有模型(用户、地址、项目…)上实现。因此,我不是通过调用构造函数来创建对象,而是通过调用相应类的静态加载函数(如果我必须创建多个实例)来创建对象。这会导致一个类型错误:keyClassMap[key]不是一个函数