TypeScript / Angular2에서 인터페이스 및 모델을 사용하는 경우


198

최근에 TypeScript를 사용하여 Angular 2에 대한 자습서를 보았지만 언제 인터페이스를 사용하고 언제 모델을 사용하여 데이터 구조를 보유하는지 확실하지 않습니다.

인터페이스 예 :

export interface IProduct {
    ProductNumber: number;
    ProductName: string;
    ProductDescription: string;
}

모형의 예 :

export class Product {
    constructor(
        public ProductNumber: number,
        public ProductName: string,
        public ProductDescription: string
    ){}
}

URL에서 JSON 데이터를로드하고 인터페이스 / 모델에 바인딩하고 싶습니다. 때로는 단일 데이터 객체를 원하고 다른 시간에는 객체를 잡고 배열하려고합니다.

어느 것을 사용해야하며 왜 그런가요?


14
사용자 정의 로직 초기화가 필요할 때 클래스를 사용하십시오. 그렇지 않으면 컴파일 타임에만 사용할 수 있으므로 항상 인터페이스를 사용하십시오. 타입 스크립트 인터페이스는 자바 스크립트에 없기 때문에 자바 스크립트로 컴파일되지 않습니다.
Dieterg

6
인터페이스는 Angular 2에서 의존성 주입과 함께 작동하지 않습니다. 여기서 클래스를 사용해야합니다.
jlang

답변:


137

인터페이스는 컴파일 타임에만 있습니다. 이를 통해 수신 된 예상 데이터가 특정 구조를 따르는 지 확인할 수 있습니다. 이를 위해 컨텐츠를이 인터페이스로 캐스트 할 수 있습니다.

this.http.get('...')
    .map(res => <Product[]>res.json());

다음 질문을보십시오 :

클래스와 비슷한 것을 할 수 있지만 클래스와의 주요 차이점은 런타임에 생성자 (생성자 함수)가 있으며 처리를 통해 메소드를 정의 할 수 있다는 것입니다. 그러나이 경우 객체를 사용하려면 객체를 인스턴스화해야합니다.

this.http.get('...')
    .map(res => {
      var data = res.json();
      return data.map(d => {
        return new Product(d.productNumber,
          d.productName, d.productDescription);
      });
    });

27
자세한 답변 주셔서 감사합니다. 인터페이스가 컴파일 타임에만 사용된다면 컴파일러는 실제로 http get을 검사하지 않고 JSON 파일의 구조를 어떻게 확인할 수 있습니까? 그것이 가능하지 않다면 인터페이스로 귀찮게하는 요점은 무엇입니까?
I_LIKE_FOO

7
@I_LIKE_FOO 컴파일러는 get call을 검사 할 필요가 없습니다. 알고있는 유형과 올바르게 정렬되었는지 확인하는 것만 중요합니다. var data = res.json();실제로 var data: any = res.json();컴파일러에게 있으므로 모든 유형 검사를 잃습니다 data. 여기서 더 유용한 것은 반환 된 json에서 데이터 구조를 모델링하는 인터페이스 var data: ProductDto[] = res.json();와 같은 것 입니다 ProductDto.
GFoley83

3
더보기 : angular.io/guide/styleguide#style-03-03Angular style guide says not to use interfaces.Always use classes.
Sampath

4
그렇습니다. 그러나 문제는 Typescript를 조작 한 전문가가 아닙니다. 그것은 마이크로 소프트와 회사 일 것입니다. 적절한 경우 인터페이스와 클래스를 선호하는 경향이 있습니다. 또한 ... 보너스 포인트 중 하나는 런타임이며, 다른 하나는 컴파일시에있다
톰 Stickel

11
@Sampath 아마도 "데이터 모델에 인터페이스를 사용하는 것이 좋습니다"라는 메시지가 표시되면서 Angular 스타일 가이드가 업데이트되었을 것입니다. 데이터 모델의 클래스보다 인터페이스를 선호합니다.
Mikezx6r

40

인터페이스 A의 계약 중 하나를 설명 클래스 또는 새로운 유형을 . 순수한 Typescript 요소이므로 Javascript에 영향을 미치지 않습니다.

모델, 즉 class 는 새 객체를 생성하는 데 사용되는 실제 JS 함수입니다.

URL에서 JSON 데이터를로드하고 인터페이스 / 모델에 바인딩하고 싶습니다.

모델을 찾으십시오. 그렇지 않으면 Javascript에서 여전히 JSON입니다.


4

@ThierryTemplier가 서버에서 데이터를 수신하고 구성 요소간에 모델을 전송한다고 말하면서 (인텔리 센스 목록을 유지하고 디자인 타임 오류를 만들기 위해) 인터페이스를 사용하는 것이 좋지만 서버 (DTO)에 데이터를 보내는 것이 클래스를 사용하는 것이 좋습니다 모델에서 자동 매핑 DTO의 장점.


-22

모든 연구 후에 내가 찾은 인터페이스 대신 클래스를 사용하십시오 .

왜? 클래스만으로는 클래스 플러스 인터페이스보다 코드가 적습니다. (어쨌든 데이터 모델에 클래스가 필요할 수 있습니다)

왜? 클래스는 인터페이스 역할을 할 수 있습니다 (확장 대신 구현 사용).

왜? 인터페이스 클래스는 각도 의존성 주입에서 공급자 조회 토큰 일 수 있습니다.

각도 스타일 안내서에서

기본적으로 클래스는 인터페이스가하는 모든 것을 할 수 있습니다. 따라서 인터페이스를 사용할 필요가 없습니다 .


10
Angular Style Guide는 현재“ 데이터 모델 용 인터페이스 사용을 고려하십시오 . "
알렉스 피터스

@AlexPeters 정통 링크를 제공하십시오. 미리 감사드립니다
Anand Phadke

@AnandPhadke는 위의 의견을 썼을 때부터 Angular Style Guide에 대한 Wayback Machine 링크 입니다.
Alex Peters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.