В машинописном тексте as
ключевое слово - это не приведение типа, а утверждение типа.Итак, что происходит, это:
- вы запрашиваете
User[]
- вы получаете
JSON object[]
JSON object[]
превращается в пользователямассив интерфейса (посмотрите, что такое интерфейс в машинописи) - компилятор принимает
this.userList
как User[]
, но это только утверждение типа
Так что с помощью as
ключевое слово в данном случае является избыточным и совершенно бесполезным.
Утверждение типа полезно только для автозаполнения и других подобных вещей, которые разрабатываются во время компиляции.Но это не настоящий актерский состав.Поэтому, когда вы выполняете свой код, this.userList
всегда является JSON Object[]
Если вам нужны реальные объекты User, вы должны сделать что-то вроде этого:
_service.getUsers().then(i => {
this.userList = i.map(u => new User(u));
console.log(this.userList)
});
Очевидно, вы должны определить конструктор вваш User
класс
РЕДАКТИРОВАТЬ
Глядя на ваш файл авторов, я вижу, что вы используете синтаксис xml, который преобразуется в массив, рассматриваемый как объект.По этой причине оператор карты не работает.Я немного изменил твой код
Пользователь
export class User {
userID : number;
FirstName : string;
userAge : string;
constructor()
constructor(u: User)
constructor(u?: User) {
this.userID = u && u.userID || -1;
this.FirstName = u && u.FirstName || '';
this.userAge = u && u.userAge || '';
}
clone(): User {
// TODO CLONE USER
return new User();
}
}
AppComponent
import { Component } from '@angular/core';
import { AppserviceService } from './appservice.service';
import { User } from './user';
import 'rxjs/add/operator/map';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
private userList: User[] = [];
constructor(private _service: AppserviceService) {
_service.getUsers().then(i => {
for (let c=0; c<10; c++) {
let u = new User(i[c]);
this.userList.push(u);
}
console.log('this.userList', this.userList);
});
}
}