2016-07-22 8 views
0

TypeScript에서 컨테이너를 만듭니다. 그것은 어떤 컨테이너가 될 수 있지만, 나는 다음과 같은 간단한 예제를 사용합니다 : 특정 메소드에 대한 일반 클래스를 제한 할 수 있습니까?

class Container<T> { 
    val: T; 
    constructor(t: T) { 
    this.val = t; 
    } 
} 

가 나는의 숫자와 두 개의 용기가 있다면, 나는 쉽게로 새 컨테이너를 만들 수 있도록 기능을 제공하고 싶은 말을 그 숫자들은 합쳐졌다.

class Container<T> { 
    val: T; 
    constructor(t: T) { 
    this.val = t; 
    } 
    add(c: Container<number>): Container<number> { 
    return new Container(this.val + c.val); 
    } 
} 

그러나 위 코드를 typecheck 할 수 있는지는 알 수 없습니다. 문제는 내가 this.val에 대해 알고있는 것이 그것이 T (이것은 아무것도 아님)이라는 것입니다. 어떻게 든 add 메서드를 제한하여 Container<T>의 인스턴스에서만 호출 할 수 있도록하려는 경우 T == number입니다. TypeScript에서 가능합니까?

위의 예는 단지 인위적인 예입니다. 내가 실제로하고 싶은 것은 응용 펑터 (functor)를위한 TypeScript 인터페이스를 만드는 것입니다.

ap<A, B>(c: Container<A>): Container<B> { 
    return new Container(this.val(c.val)); 
} 

그래서이 경우에는 내가 T == (a: A) => B 있음을 알고 있어야합니다 :는 실용적 기능은 Container이 같을 것이다 방법이있다.

interface Applicative<T> { 
    ... 
    ap: <A, B>(a: Applicative<A>) => Applicative<B> // where T == (a: A) => B 
    ... 
} 

이 중 하나라도 가능 : 더 일반적으로 나는이 인터페이스를 정의 할 수 있도록하고 싶습니다?

+1

안내서가 있습니다. https://www.typescriptlang.org/docs/handbook/generics.html#generic-constraints – toskv

+0

설명서를 읽었습니다. 그러나 함수에 일반 제약 조건을 추가하는 방법 만 보여줍니다. 내가 알 수있는 한 내 문제가 해결되지 않는다. – paldepind

+0

하나의 방법으로 t를 구속하는 것은 불가능합니다. – toskv

답변

1

당신은 할 수 없습니다 단일 메서드에 적용되는 T에 대한 제한 사항이 있습니다. 수업 수준에서만 수업을들을 수 있습니다.

0

제네릭 형식에 제약 조건을 추가 할 수 있습니다. 귀하의 경우에는

이 같은 것을 할 수있는 :

interface HasNumber { 
    x: number; 
} 

class Container<T extends HasNumber> { 
} 

을하지만 당신은 숫자, 문자열, 부울 등의 기본 유형을 사용하여 제약 조건을 가질 수 없습니다 ...

+0

그건 내가 원하는 것이 아닙니다. 나는 전체 수업에서'T'를 강요하고 싶지 않습니다. 'Container'가 모든 타입에서 작동하지만, 한 메소드가'T'가 제약 조건을 만족할 때만 작동하기를 원합니다. – paldepind

+0

단일 메서드를 일반으로 만들 수 있습니다. 이렇게 myMethod (x : T) {....} – vintem