我从远程REST服务器读取了一个JSON对象.此JSON对象具有typescript类的所有属性(按设计).如何将收到的JSON对象强制转换为类型var?
我不想填充一个typescript var(即有一个带有这个JSON对象的构造函数).它很大并且通过属性按子对象和属性跨子对象复制所有内容将花费大量时间.
更新:您可以将其转换为打字稿界面!
这令我困惑.我不知道怎么解释这个,但这是我的调试代码的样子.在它下面,您可以看到这两个日志的输出.第一个清楚地显示了我正在尝试访问的属性的完整JavaScript对象,但下一行代码我无法使用config.col_id_3访问它(请参阅屏幕截图中的"undefined"?).有谁能解释一下?我也可以访问除field_id_4之外的所有其他属性.
console.log(config);
console.log(config.col_id_3);
Run Code Online (Sandbox Code Playgroud)
这就是这些console.log()在Console中打印的内容

目前我正在开发一个打字稿项目,我真的很喜欢TypeScript带来的类型推断.但是 - 当从HTTP调用获取对象时 - 我可以将它们转换为所需类型,获取代码完成并在它们上编译函数编译时间,但这些会导致错误运行时
例:
class Person{
name: string;
public giveName() {
return this.name;
}
constructor(json: any) {
this.name = json.name;
}
}
var somejson = { 'name' : 'John' }; // Typically from AJAX call
var john = <Person>(somejson); // The cast
console.log(john.name); // 'John'
console.log(john.giveName()); // 'undefined is not a function'
Run Code Online (Sandbox Code Playgroud)
虽然这很好地编译 - 并且intellisense建议我使用该函数,但它给出了运行时异常.解决方案可能是:
var somejson = { 'name' : 'Ann' };
var ann = new Person(somejson);
console.log(ann.name); // 'Ann'
console.log(ann.giveName()); // …Run Code Online (Sandbox Code Playgroud) 我有这个简单的组件
import {Component} from 'angular2/core';
import {RouterLink, RouteParams} from 'angular2/router';
import {Http, Response, Headers} from 'angular2/http';
import {User} from '../../models/user';
import 'rxjs/add/operator/map';
@Component({
template: `
<h1>{{user.name}} {{user.surname}}</h1>
`,
directives: [RouterLink],
})
export class UserComponent {
user: User;
constructor(private routeParams: RouteParams,
public http: Http) {
this.user = new User();
this.http.get('http://localhost:3000/user/' + this.routeParams.get('id'))
.map((res: Response) => res.json())
.subscribe((user: User) => this.user = user);
console.log(this.user);
}
}
Run Code Online (Sandbox Code Playgroud)
为什么不subscribe将响应转换为完整User对象.当我记录user变量时,我的控制台说User {_id: undefined, name: undefined, surname: undefined, email: undefined} …
在我的服务器端,我有一个包含HashMap的Java对象.我想将它序列化为JSON,将其返回到我的Angular2客户端并将其用作那里的Map/Dictionary.
这是班级:
public class FileUploadResult {
String timestamp;
String message;
String status;
HashMap<String, String> parameters;
public FileUploadResult(String status, String message, String timestamp, HashMap parameters) {
this.status = status;
this.message = message;
this.timestamp = timestamp;
this.parameters = parameters;
}
Run Code Online (Sandbox Code Playgroud)
}
这是我在客户端收到的JSON:
{"timestamp":"","message":"Test","status":"1","parameters":{"myKey":"Value","mySecondKey":"Another Value"}}
Run Code Online (Sandbox Code Playgroud)
这是我收到的Angular2 http调用:
this.http.post(this.uploadURL, formData).map((res:Response) => res.json() as FileUploadResult).catch(this.handleError);
Run Code Online (Sandbox Code Playgroud)
客户端上的FileUploadResult如下所示:
export class FileUploadResult {
status: string;
timestamp: string;
message: string;
parameters: Map<string, string>;
constructor() {
this.parameters = new Map<string, string>();
}
addParameter(key: string, value: string) {
this.parameters.set(key, value);
} …Run Code Online (Sandbox Code Playgroud) 这个计算属性lastSeenString过去对我有用:
export class User {
public lastSeen?: Date;
private _lastSeenString?:string = "";
get lastSeenString():string {
return Time.timeSince(this.lastSeen);
}
}
Run Code Online (Sandbox Code Playgroud)
但现在lastSeenString回来了"".return从不调用getter中的语句.怎么会?lastSeen填充.
客户:
it('Displays the user\'s "last seen"', () => {
component.user.lastSeen = new Date();
fixture.detectChanges();
expect(component.user.lastSeenString).toBe("less than a minute ago");
expect(page.lastSeen.innerText).toBe("last seen less than a minute ago");
});
Run Code Online (Sandbox Code Playgroud)
我的打字稿编译成es5.为什么getter中的代码没有执行?
应该执行但不执行的时间类:
export class Time {
public static timeSince(date: Date) {
let start = +new Date();
let elapsed = +new Date() …Run Code Online (Sandbox Code Playgroud) 全部,
尝试绑定到模型上的函数时出现错误
我有以下组件、模型和 Html(对于这个例子都是假的)
export class TestModel {
public getSomeValue(): string {
return "Hello World";
}
}
Run Code Online (Sandbox Code Playgroud)
让我们假设 testModels 属性以某种方式获取它的数据。
@Component(...)
public class MyComponent {
public testModels: TestModel[];
ngOnInit() {
this.loadData();
}
public loadData(): void
{
this.http.get("...")
.map(r=>r.json as TestModel[]) // <--- I think now you've asked the question, I see the problem on this line
.subscribe(d=>this.testModels = d);
}
}
Run Code Online (Sandbox Code Playgroud)
现在在我的 html
<div *ngFor="let testModel of testModels">
<span>{{testModel.getSomeValue()}}</span> <!-- This fails -->
</div>
Run Code Online (Sandbox Code Playgroud)
这是完整的错误:
error_handler.js:48 EXCEPTION: Error in ./MyComponent …
我有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
}
];
Run Code Online (Sandbox Code Playgroud)
我还创建了User类,如下所示:
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
}
Run Code Online (Sandbox Code Playgroud)
我的计划是将命令JSON数组转换为User数组.在JSON内部,我获得了整数角色.我班上有管理员和驱动程序布尔字段.这在复选框的ngModel中是必需的.
现在问题出在这一行之后
var users: Array<User> = JSON.parse(JSON.stringify(json));
Run Code Online (Sandbox Code Playgroud)
我无法从User类调用方法,例如users[0].isDriver()因为编译器无法识别isDriver()方法.
有谁知道如何解决这个问题?