2017-02-23 3 views
1

Visual Studio 2015 및 Typescript 2.0.3.0을 사용하고 있습니다.추상 함수에서 제네릭을 반환 할 때 Typescript가 타이핑하지 않습니다.

내 기본 클래스에는 Promise를 반환하는 추상 메서드가있는 매우 간단한 상속 모델이 있습니다.

위에서 볼 수 있듯이 기본 클래스는 제네릭을 사용하여 하위 클래스에서 사용중인 모델 유형 (이 경우 TModel)을 제한합니다.

Generate를 반환하는 GetVehicle을 선언 할 때 Typescript는 하위 클래스 (GrandPrix)에서 "Car"유형을 반환하도록 강제합니다.

관심의
interface IVehicle { 
    Name:string; 
} 

class Car implements IVehicle { 
    Name: "CAR"; 
} 

class MotorBike implements IVehicle { 
    Name: "MotorBike"; 
} 


abstract class Race<TModel extends IVehicle> { 

    protected abstract GetVehiclePromise(): Promise<TModel>; 
    protected abstract GetVehicle(): TModel; 
} 

class GrandPix extends Race<Car> { 
    // This works - it has to be type 'Car' 
    protected GetVehicle(): Car { return null; } 

    // This works, but SHOULD NOT - I can return Promise<anything_at_all> and it still compiles. Even something non-IVehicle like Promise<string> 
    protected GetVehiclePromise(): Promise<MotorBike> { return null; } 
} 

, 나는 또한 일반을 받아 다른 클래스와 약속의 사용을 대체하는 시도 : 나는 약속하는 반환 형식을 변경하는 경우

그러나, 타이프 라이터는 더 이상 반환 형식을 적용하지 않습니다 - 같은 문제 :

class Simple<T> { 
    ID: ""; 
} 

abstract class Race<TModel extends IVehicle> { 
    protected abstract GetVehiclePromise(): Simple<TModel>; 
} 

class GrandPix extends Race<Car> { 
    // Also compiles when it should not 
    protected GetVehiclePromise(): Simple<MotorBike> { return null; } 
} 

그래서이 약속 <> 선언 문제가되지 않습니다, 그것은 제네릭 (내 생각)와 함께 할 것입니다.

미리 감사드립니다.

답변

1

첫 번째 예제는 Typescript 2.2 (아마도 2.1 또한)에서 예상대로 실패 할 것입니다. 이는이 약속이 Typescript로 약속 된 issue 일 것으로 생각됩니다.

두 번째 예제는 TypeScript가 generics과 형식 호환성을 처리하는 방법으로 컴파일됩니다. 특히 Simple<T>은 형식 인수를 사용하지 않습니다.

다음과 같은 변경이 예상되는 오류를 얻을 것이다 한 경우 :

class Simple<T> { 
    ID: T; 
} 
+0

예, 당신 말이 맞아를! 업그레이드를 통해 첫 번째 문제가 해결되었습니다. 그리고 두 번째에 대한 설명을 위해 고마워요. 진실한 붉은 청어, 나는 두 번째 문제점이 나타나면 약속의 잠재적 인 문제를 일축했다. – Ben