2016-09-13 2 views
1

제목대로.이 실제 값의 하위 집합 인 유형을 정의하는 올바른 방법은 무엇입니까?

내 이오니아 2 (Angular2/TS) 앱에서 위도와 경도 (고도 : 숫자 등)와 같은 필드 집합을 반환하는 코드바 플러그인 (geolocation)을 사용하고 있습니다.

그러나 내 관심의 유일한 2 개 필드, 그래서 나는 유형 정의 :

coordinates: {latitude: number; longitude: number;}; 

이 결국 다른 속성있을 것입니다 변수의 유형 (정의하는 올바른 방법인가를 위도)? 그렇지 않은 경우 올바른 방법은 무엇입니까?

답변

4

Typescript는 형식의 모양을 검사하고 필요한 속성이 있는지 확인할 수있는 한 추가 속성을 허용 할 수 있습니다.

예를 들어, 당신은 유형을 정의 할 수 있습니다와 같은 기능 :

type Coordinates = {latitude: number, longitude: number}; 

function logCoordinates(coords: Coordinates) { 
    console.log('coordinates:', coords.latitude, coords.longitude); 
} 

와 타이프 라이터 행복하게 이러한 호출 중 하나를 받아 들일 것입니다 :

logCoordinates({latitude: 1, longitude: 2}); 

// assuming we have a CoordinateClass know to have lat and long 
const coordinates = new CoordinateClass(1, 2); 
logCoordinates(coordinates); 

유형 주석은 계약의 모양을 설명합니다. 우리가 증명할 수있는 어떤 매개 변수도 계약을 만족시킬 수 있습니다. 그러나 추가 속성이 항상 허용되는 것은 아닙니다.

당신이 여분의 특성을 가지고있는 경우

는 객체 리터럴을 전달하는 - 클래스의 인스턴스가이 문제를 가지고 있지 않습니다 - 당신이 원하는 형태로 캐스팅해야 할 수 있습니다

logCoordinates(<Coordinates>{latitude: 1, longitude: 2, altitude: 3}); 

당신이 더 많은 것을 해결할 수 있습니다 견고 어떤 타의 추종을 불허하는 키 수용에 의해 캐스팅 할 필요 제거하는 교차 형, as described here 사용 : 당신의 대답에 대한

type Coordinates = {latitude: number, longitude: number} & {[key: string]: number}; 
+0

감사합니다; 당신은 왜 (단지 당신이 Angular2의 클래스에 대해 말하고 있었는지) "클래스 인스턴스에는이 문제가 없습니다"라는 이유를 명확히 할 수 있습니까? – dragonmnl

+0

@dragonmnl 추가 속성을 막는 유형 검사는 클래스 인스턴스가 아닌 객체 리터럴에만 적용됩니다 (TS, ES6 또는 기존). – ssube

관련 문제