当从LocalStorage为对象赋值时,如何在typescript对象中创建实例方法

时间:2017-02-28 11:50:04

标签: angular typescript

我是Java开发人员,但我正在尝试使用打字稿。

这是我的用户对象:

#makeObject

还有其他打字稿......

export class User
{
    id: string;
    name: string;
    email?: string;
    unit: string;
    street: string;
    postalcode: string;
    paymentmode: string;

    public isComplete(): boolean
    {
        if(this.id != null && this.email != null && this.isAddress()){ return true}
        else return false;
    }

    public isAddress(): boolean
    {
        if(this.street != null && this.postalcode != null){ return true}
        else return false
    }


}

我假设localStorage已解析为用户!

我无法以这种方式访问​​isComplete方法

var user = new User();
user = this.loginService.getLocalUser();

相反,我需要将它用作静态对象

user.isComplete()

我的getLocaluser:

User.isComplete

我怎样才能实现它?

QueueBrowser

6 个答案:

答案 0 :(得分:8)

使用此

let user = new User().deserialize(this.loginService.getLocalUser());

现在在User模型中添加deserialize()方法

deserialize(input: any): User {
    var self: any = this;
    for (let prop in input) {
            self[prop] = input[prop];
    }
    return self;
}

当您使用User调用您的网络服务并将其映射到parse()对象时,会发生什么情况,因为它们不在您的{{1}中,因此未创建实例方法对象deserialize()所做的是创建response对象的新副本,并逐个从响应中复制值。

答案 1 :(得分:5)

只需使用从User检索到的已解析JSON数据来实例化localStorage类。

按如下方式更改getLocalUser方法:

getLocalUser(): User {
    let userData = JSON.parse(localStorage.getItem('user'));
    let user = new User(userData);

    return user;
}

现在,当您拥有新实例时,通常可以使用该类的已定义实例方法:

let user = this.loginService.getLocalUser();
let isComplete = user.isComplete();

console.log(isComplete); // => true/false

另外,您错过了将构造函数放到User类:

export class User
{
    id: string;
    name: string;
    // ...

    constructor(userData: any) {
        this.id = userData.id;
        this.name = userData.name;
        // ...
    }

    public isComplete(): boolean
    {
        if(this.id != null && this.email != null && this.isAddress()){ return true}
        else return false;
    }

    // the rest of the methods...

}

答案 2 :(得分:4)

你只需要这样做:

var user = new User;

user.isComplete();

后编辑您的问题,如果我理解正确,您需要使用 命名空间 Triple-斜线指令 如下: 在第一个文件中, a.ts 例如:

namespace myNameSpace{
    export class User
    {
        id: string;
        name: string;
        email?: string;
        unit: string;
        street: string;
        postalcode: string;
        paymentmode: string;

        public isComplete(): boolean
        {
            if(this.id != null && this.email != null && this.isAddress()){ return true}
            else return false;
        }

        public isAddress(): boolean
        {
            if(this.street != null && this.postalcode != null){ return true}
            else return false
        }
    }
}

在第二个文件中。 b.ts 例如:

/// <reference path="a.ts" />
namespace myNameSpace{
    var user = new User();
    //user = this.loginService.getLocalUser(); //this function need to be checked in your environment
    user.isComplete();
}

答案 3 :(得分:4)

错误源自此处JSON.parse(localStorage.getItem('user'));

从此语句返回的对象不是User类型的对象,因此没有isComplete成员方法。

@ rattlehand的解决方案对您来说应该足够了。但是代码变得如此动态。

但我更喜欢将解决方案完全打字,因为这是使用TS的一个重要目标。

export interface User
{
    id: string;
    name?: string;
    ...
}

function isComplete(user: User) { 
    if (user.id != null && user.email != null ) { 
        return true;
    }
    return false;
}

function getLocalUser(): User {
    var user = JSON.parse(localStorage.getItem('user')) as User;
    return user;
}

var user = getLocalUser();
console.log(isComplete(user)); // true or false

使用接口代替模型的类可能是奇怪的Java。它适用于我在大多数流行的框架中使用过的,例如用TS编写的框架。 Angular,RxJs。这同样适用于DefinitelyTyped的定义。当然,Class是更好的解决方案。我会离开这个空间让你知道。

您甚至可以通过创建通用包装来进一步严格键入localStorage

export class LocalStorageService {
    private storage = localStorage;

    get<T>(key: string): T {
        var serialized: string = this.storage.getItem(key);
        return serialized ? <T>JSON.parse(serialized) : undefined;
    }

    set<T>(key: string, data: T) {
        var serialized: string = JSON.stringify(data);
        this.storage.setItem(key, serialized);
    }

    remove(key: string) {
        this.storage.removeItem(key);
    }
}

答案 4 :(得分:3)

简单地说:

getLocalUser(): User {
    return Object.assign(new User(), JSON.parse(localStorage.getItem('user')));
}

你在MDN: Object.assign()之后):

  

将所有可枚举的自有属性的值从一个或多个源对象复制到目标对象。

  

它将返回目标对象。

所以你最终得到了User的新创建的实例以及来自解析的JSON的所有道具。

答案 5 :(得分:0)

试试这个

var user = (<User>this.loginService.getLocalUser());