我是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
我怎样才能实现它?
答案 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());