2017-12-11 2 views
1

이상한 제목에 대해 유감스럽게 생각합니다. 한 문장으로 무엇을 하려는지 설명하는 방법을 알지 못합니다.클래스 데코레이터, 클래스가 확장되고 다른 클래스를 구현하는지 확인하는 방법

나는 하나의 클래스에서 확장되어이 다른 클래스를 구현할 클래스를 정의해야합니다.

class SoulCoughing extends Super implements BonBon { /.../ } 
class MoveAside extends Super implements BonBon { /.../ } 
class LetTheManGoThru extends Super implements BonBon { /.../ } 

나는 이러한 클래스의 데코레이터로 사용하는 일종의 래퍼 기능을 작성했습니다.

const Eminem = function(klass: Constructable<????>) { 
    const instance = new klass(); 
    // Do stuff 
} 

Constructable 그렇지 않으면 타이프 라이터가 생성자를 가지고 있지 대한 오류가 발생 때문에 내가 사용하고 약간의 인터페이스입니다.

interface Constructable<T> { 
    new(): T; 
} 

지금 여기 내 문제, 내 래퍼 함수에서 klass를 파라미터에 할당 유형을 몰라? 나는이 일을 시도했다 :

... function(klass: Contrusctable<Super & BonBon>) 

이를 :

interface Constructable<T, U> { 
    new(): T & U; 
} 

... function(klass: Contrusctable<Super, BonBon>) 

하지만 내가 Argument of type 'typeof SoulCoughing' is not assignable to parameter of type 'Constructable<everythingIveTriedSoFar>' 오류가 계속 : 나는이처럼 내 constructable 인터페이스를 수정하려고

... function(klass: Contrusctable<Super | BonBon>) 

.

제 질문은 어떤 유형 정의를 klass 매개 변수와 함께 사용해야합니까? 나는 단지 any을 사용할 수 있지만 실제로 전달되는 클래스가 Super을 확장하고 BonBon을 구현했는지 확인하고 싶습니다.

답변

1

클래스 SoulCoughing 등은 실제로는 인수 생성자가 없으므로 Constructable<{}>으로 전혀 작용할 수 없다고 생각합니다. 가장 큰 원인은 Super의 생성자에 필수 인수가 있다는 것입니다. 그러면 모든 하위 클래스가 기본적으로 new()과 일치하지 않게됩니다. 이것은 또한 Eminem의 구현이 new klass(...)을 몇 가지 인수로 호출하려고 함을 의미합니다.

정확한 수정 방법은 Constructable<T>을 올바른 인수 유형을 가진 생성자로 선언하는 것입니다.마지막으로

const Eminem = function(klass: Constructable) { 
    const instance = new klass(2, "rise"); 
    // Do stuff 
} 

과 :

Eminem(SoulCoughing); // no error 
같은

interface Constructable<T extends Super & BonBon = Super & BonBon> { 
    new(chump: number, change: string): T; // same args as Super 
} 

Eminem을 :

class Super { 
    constructor(elevator: number, mezzanine: string) { 
    //... 
    } 
} 

는 그런 다음에 맞게 Constructable을 정의 할 수 있습니다 :의이 Super은 다음과 같습니다 가정 해 봅시다

는 난 단지 Constructable은 일반적인 경우에 당신은, 특정 서브 클래스의 유형을 보존과 같이 할 타이프 라이터를 원 유지 : 도움이

const SlimShady = function <T extends Super & BonBon>(klass: Constructable<T>): T { 
    return new klass(2, "fat"); 
} 

// returns same type as passed-in constructor 
const cutLean: MoveAside = SlimShady(MoveAside); 

좋아, 희망; 행운을 빕니다!

관련 문제