2017-05-04 4 views
0

방금 ​​Angular 2 및 Typescript로 재생하기 시작했으며, 최근에 아주 이상한 동작을 발견했습니다.Typescript : 클래스에 함수가있을 때 객체 리터럴을 사용하여 객체를 인스턴스화 할 수 없습니다.

내 클래스는 다음과 같습니다

export class Person{ 
    id: number; 
    name: string; 
    height: number; 
    weight: number; 

    calculateBmi() { 
    return (weight/(height*height)); 
    } 
} 

과 같이 객체 리터럴을 사용하여 새 사람을 인스턴스화 : 비주얼 스튜디오 2017 말하는

person: Person = { 
    id: 1, 
    name: "Jack Johnson", 
    height: 180, 
    weight: 70 
    }; 

나는 (설계 시간) 얻을 오류 :

유형 '{ID : 숫자, 이름 : 문자열, 높이 : 숫자, 무게 : 번호}'을 '사람'유형에 할당 할 수 없습니다. 재산권 'calculateBmi'형태없는 '{ID : 번호, 이름 : 문자열, 높이 : 수, 무게 : 숫자}'

은 또한 주장 그것이

형식을 변환 할 수 없습니다 '{ 유형 'Person': 유형 'Person'은 유형 '{id : number, name : string}에 존재하지 않는 선택적 속성'calculateBmi '를가집니다. , 높이 : 수, 무게 : 수} '.

그래서 transpiler는 'calculateBmi'를 속성이 아니라 속성으로 간주합니다. 해결 방법은 물론 생성자를 추가하고 클래스를 인스턴스화하는 데 사용합니다. 그러나 이것을 해결할 수있는 방법이 있는지 배우고 싶습니다. 그래도 객체 리터럴을 사용할 수 있습니까?

고맙습니다, 존

BTW : 내가 ReSharper에서 2017.x를 사용하고 있지만이 아닌이이 오류 메시지가 나타나는 원인을 것입니다 않습니다.

+0

당신은 사람이 TYE 사람이 될 예정이다 TS 말하는 거를 만들 수 있습니다. 형식 Person은 calculateBmi 메서드를 선언합니다. 따라서 Person 인스턴스를 가질 때마다 해당 인스턴스에서 calculateBmi()를 호출 할 수 있어야합니다. 그러나 당신의 객체 리터럴은 그런 방법을 가지고 있지 않습니다. 그래서 발에서 자신을 쏘려고 노력하고 있으며, TypeScript는 그렇게하지 못하게합니다. 당신이 말했듯이, 생성자를 호출하십시오. –

답변

1

인스턴스가 잘못되었습니다. 어느 새

person: Person = new Person() 

와 생성자를 호출 또는 리터럴 완전한 객체

person: Person = { 
    id: 1, 
    name: "Jack Johnson", 
    height: 180, 
    weight: 70, 
    calculateBmi: function() {...} 
    }; 
+0

고맙습니다 getjackx,하지만 이것은 내가 클래스를 인스턴스화 할 때마다 함수를 정의해야한다는 것을 의미합니다. 이것은 최적은 아니지만 객체 리터럴을 사용하면 ...? – YonZo

+0

어쨌든 왜 객체 리터럴을 사용 하시겠습니까? 필요한 경우 리터럴을 허용하는 생성자를 작성할 수 있습니다. 또는 클래스의 함수를 원하지 않습니다. 필요한 경우 컨트롤러 또는 서비스를 작성할 수 있습니다. – getjackx

+0

글쎄, 나는 단지 언어를 이해하려고 노력하고있다. – YonZo