2015-02-02 5 views
7

다른 클래스를 확장하고 인터페이스를 구현해야하는 제네릭을 포함하는 Typescript 클래스가 있습니다. 여기에 예제가있다Typescript 제네릭 확장 클래스 및 인터페이스

interface IHasImage { 
    imageUrl():string; 
} 
class Model { 
} 
class View<T extends Model & IHasImage> { 
} 

이것은 내가 다른 곳에서 본 구문 일 뿐이지 만 Typescript에서이 작업을 수행하는 방법은 무엇입니까?

편집 : 하여 놀이터에 다음 붙여보십시오 : http://www.typescriptlang.org/Playground

...[removed edit 1 code] 

편집 2 : 응답 및 추론

(나는 첫 번째 예는 몇 가지 결함을했다, 사과!) 나는이 github 문제 (https://github.com/Microsoft/TypeScript/issues/1885)에서 개략적으로 설명한 것처럼 약간의 포인터가 필요할 지 모르지만 아래에서 정답을 표시했습니다.

다음 코드를 사용하면 방법론이 작동하는 것을 볼 수 있습니다.

playground screenshot

말할 수있는 유일한 것은 implement에 기본 클래스를 확장하지 않는 클래스에서 인터페이스를 시도하는 것도 실패입니다. 그러나 Typescript 검사 개체의 구조를 기반으로 있기 때문에 수동으로 클래스에 name 속성을 추가하면 성공합니다. 그것은 ModelCorrect하는 extends에 성공하지만 implements하지 않는 이유

enter image description here

도있다.

+0

예제에 버그가 있다고 생각합니다. 이 생성자의 일반 형식 값이 아닙니다.클래스는 모델을 가지고 있어야합니다 : T 속성 또는 생성자가 값을 받아 들일 수 있습니다 : T argument – Martijn

답변

3

내가 찾을 수있는 유일한 방법입니다. 완벽하게 깨끗하지는 않지만 옳은 일을합니다.

playground

편집 : 추가 올바른 해결 방법 다음

interface IHasImage extends Model{ 
    imageUrl():string; 
} 

class Model { 
} 

class View<T extends IHasImage> { 
} 

가 작동하는지 확인 놀이터에서 스크린 샷입니다.

interface IHasImage { 
    imageUrl():string; 
} 

class Model { 
} 

// use the Model class like an interface 
interface IHasImageModel extends IHasImage, Model{ 
} 

class View<T extends IHasImageModel> { 
    constructor(arg :T){ 
     arg.imageUrl(); 
    } 
} 

편집 :이 타이프 1.6에서 사용할 수있는 사거리 유형 :

interface IHasImage { 
    imageUrl():string; 
} 

class Model { 
} 

class View<T extends IHasImage & Model> { 
    constructor(arg :T){ 
     arg.imageUrl(); 
    } 
} 
+0

시도해 보았습니다. 컴파일하려고했지만'this.model을하려고 할 때 내가 찾고있는 것을하지 않는다고 생각하지 않습니다. .imageUrl()'T가'imageUrl' 함수를 가지고 있지 않다고 불평합니다 –

+0

해결 방법으로 내 대답을 편집했습니다. – dignifiedquire

+0

내가 그걸 시도 할거야, 내가 그걸 시도했지만 생각하지 않았을 수도있다. –

14

타이프 라이터는 자바 나 C# 같은 너무 한정되지 않는다 예제에서 T는 다음과 같습니다.

아래 예제에서 T에 대한 구현을 추가했습니다. 제네릭 제약으로 사용할 수 있습니다.

interface IHasImage { 
    imageUrl():string; 
} 

class Model { 
} 

class ModelWithImage extends Model implements IHasImage { 

    imageUrl():string 
    { 
    return "http://thepetwiki.com/images/thumb/Kitten.jpg/400px-Kitten.jpg"; 
    } 
} 


class View<T extends ModelWithImage> 
{ 
    value:T; 

    constructor(arg:T) 
    { 
     this.value=arg; 
    }  
} 
+1

클래스보기 은 실제로 무엇을 의미합니까? – SuperUberDuper

+1

@SuperUberDuper 이것은 새로운 stackoverflow 항목에 대한 질문입니다. 요약하면 generic 클래스의 타이프 스크립트 (typcript) 방법입니다. https://www.typescriptlang.org/docs/handbook/generics.html#generic-classes \t 요구 사항을 충족하는 모든 유형에서이 클래스를 사용할 수 있습니다. "extens IHasImage & Model " – Magu

+0

위대한 thx !!!!!!!! – SuperUberDuper

1

누락 당신이 그런 일을 할 수 있도록

+0

모델 확장은 불행히도 많은 종류의 모델이 동일한 'IHasImage'기능을 가질 수 있기 때문에 너무 광범위합니다. –

관련 문제