2017-03-13 3 views
4

기본 속성 값이 존중되도록 객체를 클래스 유형으로 유형 변환 할 수 있습니까? 예를 들어타입 캐스팅시 Typescript 기본 속성

:

class Person { 
    name: string = "bob"; 
    age: number; 
    sex: string; 
} 

var data = { 
    "age": 23, 
    "sex": "male" 
} 

var p = <Person>data; 

console.log(p.name); // -> undefined 

그래서 p.name는 밥이있다 할 수있는 가장 간단한 방법은 무엇입니까?

*이 작동하는 것 같다

편집 :

var record : Person = Object.assign(new Person(), p); 

이 좋은 또는 나쁜 관행인가?

+0

당신이 당신의 질문을 명확히해야합니다 다음 캐스팅 피하기를 필드와 유형을 적용하는 대신 명시 적으로 변수의 유형을 설정합니다. 객체를 캐스팅 할 때 클래스의 인스턴스를 원하거나 유형을 적용합니까? 예를 들어'var p : Person = {name = "default", ... data}'는 타입을 작동시키고 시행하지만 클래스의 인스턴스가 아닙니다. 이를 위해 이니셜 라이저를 사용하는 클래스 생성자를 사용하는 것이 더 나을 것입니다. 참조하십시오 : http://stackoverflow.com/questions/14142071/typescript-and-field-initializers/37682352#37682352 –

+0

json의 데이터로 채워진 클래스 인스턴스가 필요합니다. – Guerrilla

답변

3

당신에게 클래스의 인스턴스를 제공하는 가장 간단한 방법은 생성자 initialiser를 사용하여 옵션 기본값으로 필드를 만드는 것입니다. 당신이 클래스의 인스턴스 것에 대해 걱정하지 않는 경우

class Person { 
    name: string = "bob"; 
    age: number; 
    sex: string; 
    constructor(opt?: Partial<Person>) { 
    Object.assign(this, opt); 
    } 
} 

,하지만 당신 : 당신은 그냥 모든 옵션 이니셜 필드을 부여하든 상관하지 않는 경우

class Person { 
    name: string = "bob"; 
    age: number; 
    sex: string; 
    constructor(opt: { name?: string, age: number; sex: string; }) { 
    Object.assign(this, opt); 
    } 
} 

또는,

var data = { 
    "age": 23, 
    "sex": "male" 
} 

var p1:Person = {name:"bob", ... data}; // or 
var p2:Person = {new Person(), ... data}; 
+0

감사합니다. 기본 필드를 선택해야하는 이유는 무엇입니까? – Guerrilla

+0

그것은 당신이 initialiser에서 그들을 통과 할 필요가 없다는 것을 의미합니다 : 예 :'new Person ({age : 20, sex : "male"}) –

+0

아, 정말 고마워요. – Guerrilla

1

Type Assertions (타입 캐스팅)으로 할 방법이 없습니다. 컴파일 타임에 평가되지만, 런타임에는 Default Values이 해석됩니다.

이들은 완전히 다른 단계입니다.

class Person { 
    name?: string = "bob"; 
    age: number; 
    sex: string; 
    constructor(opt: Person) { 
    Object.assign(this, opt); 
    } 
} 

또는이고 초기화 선택하지 무엇에 명시 :

+0

어떻게 할 것인가? 어떤 방법으로 개체를 인스턴스화 한 다음 기본 값이 있으므로 속성을 병합합니까? – Guerrilla

+0

그렇습니다. 인스턴스 (* :'{... p, ..)와 함께 [spread] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Spread_operator) 할 수 있습니다. .overrides}'. 기본값을 원한다면'{... defaults, ... p}'를 사용하십시오. 당신은 어느 시점에서'새로운'을 사용해야 할 것입니다. –

+0

나는 퍼짐에 그 페이지를 읽었다. 개체를 병합하는 데 적용 할 수있는 명백한 방법을 볼 수 없었습니다. 나는'Object.assign (new Person(), p)'을 사용하여 작업을 처리하게 만들었지 만, 그런 기본 속성을 가진 모든 객체를 초기화하는 것이 좋은 방법인지는 확실치 않습니다. – Guerrilla

관련 문제