[TypeScript] 프로그래밍 실습 1: Google의 TypeScript 코드 스타일 7: 인터페이스

15641 단어 프로그래밍 언어

TypeScript 언어 사양

  • 7 커넥터
  • 7.1 인터페이스 선언
  • 7.2 성명 합병
  • 7.3 인터페이스 확장 클래스
  • 7.4 동적 유형 검사
  • 7 커넥터


    인터페이스는 명명과 매개 변수화된 대상 유형을 제공하고 기존의 명명 대상 유형을 새로운 대상으로 조합하는 능력을 제공합니다.
    인터페이스가 실행되지 않았을 때 표시됩니다. 이것은 순전히 컴파일할 때 만들어진 것입니다.인터페이스는 기록과 검증에 필요한 속성 형상을 매개 변수로 전달하는 대상과 함수에서 되돌아오는 대상으로 특히 유용하다.
    TypeScript는 구조 유형 시스템을 가지고 있기 때문에 특정한 구성원 그룹을 가진 인터페이스 유형은 같은 구성원 그룹을 가진 다른 인터페이스 유형이나 대상 유형의 문자와 같다고 여겨진다(또는 대체할 수 있다)(제3.11.2 절 참조).
    클래스 선언은 인터페이스가 구현되었는지 확인하기 위해 자신의 Implements 자문에서 인터페이스를 참조할 수 있습니다.

    7.1 인터페이스 선언


    인터페이스 성명 인터페이스 형식입니다.
    InterfaceDeclaration:
    	interface BindingIdentifier TypeParametersopt InterfaceExtendsClauseopt ObjectType
    
    InterfaceExtendsClause:
    	extends ClassOrInterfaceTypeList
    
    ClassOrInterfaceTypeList:
    	ClassOrInterfaceType
    	ClassOrInterfaceTypeList , ClassOrInterfaceType
    
    ClassOrInterfaceType:
    	TypeReference
    

    InterfaceDeclaration은 포함된 선언 공간에 명명 유형(섹션 3.7)을 도입했습니다.인터페이스 선언의 BindingIdentifier는 미리 정의된 유형 이름 중 하나가 아닐 수 있습니다(3.8.1절).
    인터페이스는 유형 매개 변수(3.6.1절)를 선택할 수 있으며, 이 유형 매개 변수는 유형 인용에서 인터페이스를 인용할 때 제공할 실제 유형의 자리 차지 문자로 사용된다.유형 파라미터가 있는 인터페이스를 유니버설 인터페이스라고 부른다.일반 인터페이스 선언의 유형 매개변수는 전체 선언 범위 내에 있으며 InterfaceExtendsClause 및 ObjectType 바디에서 참조할 수 있습니다.
    인터페이스는 InterfaceExtendsClause에서 지정한 기본 유형을 0개 이상 상속할 수 있습니다.기본 형식은 클래스나 인터페이스 형식의 형식에 대한 인용이어야 합니다.
    인터페이스에는 선언된 ObjectType에 지정된 멤버가 있으며 인터페이스의 선언에 숨겨지지 않은 모든 기본 유형 멤버가 상속됩니다.
  • 속성 성명은 같은 이름을 가진 공공 기본 유형의 속성을 숨깁니다.
  • 문자열 색인 서명 성명은 기본 형식의 문자열 색인 서명을 숨깁니다.
  • 디지털 인덱스 서명 성명은 기본 형식의 디지털 인덱스 서명을 숨깁니다.

  • 인터페이스 선언은 다음 구속을 충족해야 합니다. 그렇지 않으면 컴파일 시 오류가 발생합니다.
  • 인터페이스 성명은 같은 성명에서 유래한 기본 유형을 직접 또는 간접적으로 지정할 수 없다.다시 말하면 유형 파라미터가 어떻든지 간에 인터페이스는 직접적이거나 간접적으로 그 자체의 기본 유형이 될 수 없다
  • 인터페이스는 계승된 사유 또는 보호된 속성과 같은 이름의 속성을 성명할 수 없습니다.
  • 같은 명칭을 가진 상속 속성은 반드시 같아야 한다(3.11.2절).
  • 인터페이스의 모든 속성은 3.9.4절에서 지정한 인터페이스 인덱스 서명에 포함된 제약을 충족시켜야 한다.
  • 성명된 인터페이스의this-type(3.6.3절)은 각 기본 유형에 대한 인용을 분배할 수 있어야 한다.

  • 인터페이스가 여러 기본 유형에서 같은 구성원을 계승할 수 있도록 허용하고, 이러한 상황에서 특정한 구성원마다 하나의 실례만 포함한다.
    다음은 이름이 같지만 유형이 다른 두 개의 속성을 포함하는 인터페이스의 예입니다.
    interface Mover {  
        move(): void;  
        getStatus(): { speed: number; };  
    }
    
    interface Shaker {  
        shake(): void;  
        getStatus(): { frequency: number; };  
    }
    

    'Mover' 와 'Shaker' 인터페이스를 확장하려면 새로운 'getStatus' 속성을 명시해야 합니다. 그렇지 않으면 두 종류의' getStatus' 속성을 계승합니다.생성된'MoverShaker'가'Mover'및'Shaker'의 하위 유형이 되도록 새'getStatus'속성을 선언해야 합니다.
    interface MoverShaker extends Mover, Shaker {  
        getStatus(): { speed: number; frequency: number; };  
    }
    

    함수와 구조 함수 형식은 호출과 구조 서명의 대상 형식만 포함하기 때문에 인터페이스를 사용하여 명명된 함수와 구조 함수 형식을 설명할 수 있습니다.예를 들면 다음과 같습니다.
    interface StringComparer { (a: string, b: string): number; }
    

    이렇게 하면 유형'StringComparer'는 문자열이 두 개 있고 숫자가 반환되는 함수 유형으로 선언됩니다.

    7.2 결합 선언


    인터페이스는 '개방적' 이며, 공공 루트 디렉터리와 같은 한정된 이름을 가진 인터페이스 성명 (예: 2.3절에서 정의한 것) 은 단일 인터페이스를 구성한다.
    일반 인터페이스에 여러 개의 성명이 있을 때, 모든 성명은 같은 종류의 매개 변수 목록을 가져야 한다. 즉, 같은 제약이 있고 순서가 같은 같은 종류의 매개 변수 이름을 가져야 한다.
    여러 개의 성명이 있는 인터페이스에서 extends 자구는 하나의 기본 형식으로 통합되고 인터페이스 성명의 주체는 하나의 대상 형식으로 통합됩니다.성명 합병은 모든 인터페이스의 성명 구성원에 대응하는 성명 순서를 만들고, 인터페이스 성명 순서에 따라 그룹의 구성원 목록에 추가합니다.따라서 마지막 인터페이스 성명에서 성명한 구성원은 합병 유형의 성명 순서에 따라 먼저 나타난다.
    예를 들어, 다음과 같은 일련의 선언이 있습니다.
    interface Document {  
        createElement(tagName: any): Element;  
    }
    
    interface Document {  
        createElement(tagName: string): HTMLElement;  
    }
    
    interface Document {  
        createElement(tagName: "div"): HTMLDivElement;   
        createElement(tagName: "span"): HTMLSpanElement;  
        createElement(tagName: "canvas"): HTMLCanvasElement;  
    }
    

    다음과 같은 개별 선언입니다.
    interface Document {  
        createElement(tagName: "div"): HTMLDivElement;   
        createElement(tagName: "span"): HTMLSpanElement;  
        createElement(tagName: "canvas"): HTMLCanvasElement;  
        createElement(tagName: string): HTMLElement;  
        createElement(tagName: any): Element;  
    }
    

    마지막 인터페이스 성명의 구성원이 먼저 합병 성명에 나타나는 것을 주의하십시오.또한 동일한 인터페이스 주체에서 성명된 구성원의 상대적인 순서를 보존하고 있음을 주의해야 한다.
    TODO: 문서 클래스와 인터페이스 선언이 결합됩니다.

    7.3 인터페이스 확장 클래스


    인터페이스 형식이 클래스 형식을 확장할 때, 클래스의 구성원을 계승하지만, 이를 계승하지 않습니다.인터페이스가 클래스의 모든 구성원을 성명하고 실현을 제공하지 않은 것 같습니다.인터페이스는 기류의 사유 구성원과 보호 구성원까지 계승한다.개인 또는 보호된 구성원을 포함하는 클래스가 인터페이스 유형의 기본 유형일 때, 이 인터페이스 유형은 해당 클래스나 그 후대 클래스에서만 가능하다.예를 들면 다음과 같습니다.
    class Control {  
        private state: any;  
    }
    
    interface SelectableControl extends Control {  
        select(): void;  
    }
    
    class Button extends Control {  
        select() { }  
    }
    
    class TextBox extends Control {  
        select() { }  
    }
    
    class Image extends Control {  
    }
    
    class Location {  
        select() { }  
    }
    

    위의 예시에서'Selectable Control'은'Control'의 모든 구성원을 포함하고 개인'state'속성을 포함한다.'상태'는 개인 구성원이기 때문에'컨트롤'의 후손은'Selectable Control'만 실현할 수 있습니다.이는'Control'의 후손만이 같은 성명에서 유래한'state'의 개인 구성원이 있기 때문이다. 이것은 개인 구성원 겸용의 요구(3.11절)이다.
    '컨트롤' 클래스에서 'Selectable Control' 의 실례를 통해 '상태' 개인 구성원에 접근할 수 있습니다.실제로'Selectable Control'의 역할은'select'방법이 있는'Control'과 유사하다.'단추' 와 '텍스트 상자' 클래스는 'Selectable Control' 의 하위 형식입니다. '컨트롤' 에서 계승되고 '선택' 방법이 있기 때문입니다. 그러나 '이미지' 와 '위치' 클래스는 아닙니다.

    7.4 동적 유형 검사


    TypeScript는 객체가 특정 인터페이스를 구현하는지 동적으로 테스트하는 직접적인 메커니즘을 제공하지 않습니다.대신 TypeScript 코드는 JavaScript 기술을 사용하여 객체에 적절한 구성원 집합이 있는지 확인할 수 있습니다.예를 들어, 섹션 7.1의 선언에 대해 다음과 같은 MoverShaker 인터페이스를 동적으로 검사합니다.
    var obj: any = getSomeObject();  
    if (obj && obj.move && obj.shake && obj.getStatus) {  
        var moverShaker = <MoverShaker> obj;  
        ...  
    }
    

    이 체크를 자주 사용하는 경우 함수로 추상화할 수 있습니다.
    function asMoverShaker(obj: any): MoverShaker {  
        return obj && obj.move && obj.shake && obj.getStatus ? obj : null;  
    }
    

    좋은 웹페이지 즐겨찾기