당신은 (즉, JS 객체) JSON 데이터를 전송할 수 없습니다를 클래스로 .
글쎄, 할 수는 있지만 클래스의 인스턴스가 아니라 클래스 인터페이스를 만족하는 오브젝트가 있습니다.
간단한 예 :
class Point {
x: number;
y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}
let a = {
x: 5,
y: 5
} as Point;
console.log(a); // Object {x: 5, y: 5}
let b = new Point(5, 5);
console.log(b); // Point {x: 5, y: 5}
컴파일러 불평으로 약 a
는 Point
인터페이스를 만족하므로 이러한 유효 때문에 Point
인스턴스없는 :
function log(point: Point) {
console.log(`(${ point.x }, ${ point.y })`);
}
log(a); // fine
log(b); // fine
(code in playground)
작동합니다. this way because :
TypeScript의 핵심 원리 중 하나는 값 확인 모양이 에 초점을 맞추고 있다는 것입니다. 이것은 때때로 "duck typing"또는 "구조적 하위 유형 지정"이라고도합니다. TypeScript에서 이러한 유형의 이름을 지정하는 역할을 인터페이스가 채우며 프로젝트 외부의 코드로 계약서와 계약서를 정의하는 강력한 방법입니다.
More on duck typing.
는 특정 문제에 관해서는, 당신은 인터페이스로 클래스를 사용하거나 인터페이스로합니다 (두 경우 모두에서) 다음
interface Client {
id:number;
firstname: String;
lastname: String;
phone:String;
address:String;
country:String;
Security_No:String;
}
그리고 :
this._httpClientService.getAllClients().subscribe((res) => {
this.data = res.json() as Client[]
}));
그러나 경우 인터페이스를 사용하지 않고 클래스를 사용하면 속성은 공개가되어야하며 개인이 아닌 것이어야합니다.당신이 할 수 없습니다 캐스팅 다음 인터페이스 클래스로 클래스를 사용하지하고자하는 경우
, 당신은해야합니다 :
this._httpClientService.getAllClients().subscribe((res) => {
this.data = res.json().map(item => new Client(data));
}));
그리고 당신은 받아 Client
에 대한 생성자가해야합니다 인터페이스를 만들고 값을 구성원에게 할당합니다.