TypeScript 제네릭에 대해 여러 유형 제약 조건을 지정할 수 있습니까?


83

단일 유형 제약 조건이있는이 예제와 같은 일반 인터페이스가 있습니다.

export interface IExample<T extends MyClass> {
    getById(id: number): T;
}

하나가 아닌 여러 유형 제약 조건을 지정할 수 있습니까?

답변:


87

Typescript는 제네릭 유형에 대한 다중 상속을 얻는 구문을 제공하지 않습니다. 그러나 Union 유형 및 Intersection 유형을 사용하여 유사한 의미를 얻을 수 있습니다. 귀하의 경우에는 교차로를 원합니다.

interface Example<T extends MyClass & OtherClass> {}

두 유형의 Union의 경우 :

interface Example<T extends MyClass | OtherClass> {}

4
제약 조건의 목적으로 만 인터페이스를 만들 필요가 없기 때문에 공용체 유형은이를 달성하는 좋은 방법입니다. 2013 년에는 존재하지 않았지만 지금은 이것이 제가 권장하는 방법입니다.
Fenton

5
이 대답은 틀 렸습니다. 공용체 유형은 두 개의 고유 한 유형을 확장하는 것과 동일한 의미를 갖지 않습니다.
AlexG

3
@AlexG 물론 이것은 두 유형 을 확장 하는 것과 같지 않지만 두 인터페이스 를 구현 하는 것과 같습니다 .
STO

6
또한 Typescript는 교차 유형도 지원합니다. 따라서 <T extends MyInterfaceA & MyInterfaceB>유형이 두 인터페이스를 모두 구현해야합니다.
Tyler Cloutier

2
내가 이해하는 한 의미론 extends A|B은 A OR B를 extends A & B모두 확장하는 것입니다! 어쩌면 당신은 .... 당신의 대답에 모두 지정해야합니다
피포

34

이에 대한 해결 방법은 수퍼 인터페이스를 사용하는 것입니다 ( "인터페이스가 클래스에서 상속하도록 허용하는 이유"라는 질문에도 답).

interface ISuperInterface extends MyClass, OtherClass {

}

export interface IExample<T extends ISuperInterface> {
    getById(id: number): T;
}

12
이것이 올바른 솔루션입니다. 두 선언 개인 회원 경우, 인터페이스가 unfulfillable입니다 - 두 클래스에서 인터페이스를 확장하는 것은 있지만, 무서운의 종류
라이언 카바

1

클래스에서 파생 된 인터페이스에 대한 주석을 참조하십시오 ... 이름에 무엇이 있습니까?

0.9.0 사양의 섹션 3.5에서 이것을 찾았습니다.

인터페이스 선언은 명명 된 유형 만 도입하는 반면, 클래스 선언은 명명 된 유형의 구현 인스턴스를 만드는 명명 된 유형과 생성자 함수를 도입합니다. 클래스 및 인터페이스 선언에 의해 도입 된 명명 된 형식은 사소한 차이 만 있으며 (클래스는 선택적 멤버를 선언 할 수없고 인터페이스는 전용 멤버를 선언 할 수 없음) 대부분의 컨텍스트에서 상호 교환이 가능합니다. 특히 공용 멤버 만있는 클래스 선언은 인터페이스 선언으로 만든 것과 똑같은 기능을하는 명명 된 유형을 도입합니다.


이제 선택적 클래스 멤버가 구현되었습니다. github.com/Microsoft/TypeScript/pull/8625
Stefan Rein
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.