2014-01-06 2 views
1
에서 일반적인 기능을 오버로드 할 수 없음은 내가 잘못 여기서 뭐하는 거지

:는 타이프

export function fail<a>(problem: SomeProblem): a; 
export function fail<a>(message: string): a; 
export function fail<a>(messageOrProblem: any): a { throw Error(); } 

컴파일러는 말한다 : 서로 다른 곳에서 온 있기 때문에 여기

TS2148: Build: Overload signature is not compatible with function definition. 

답변

5

유형 매개 변수가 '다른'로 간주됩니다 . 다음과 같이 작성하십시오.

export function fail<a>(problem: SomeProblem): a; 
export function fail<a>(message: string): a; 
export function fail(messageOrProblem: any): any { throw Error(); } 

반환 값 위치에서만 제네릭 형식 인수를 사용하는 것은 안티 패턴입니다. a을 기반으로 반환 할 값을 결정할 방법이 없으므로 바람직하지 않은 제네릭 유형을 반환하는 것보다 any을 반환하는 것이 훨씬 정확합니다. 나는 이것을 "움직이는 캐스트"패턴이라고 부른다 :

// Bad 
x = fail<string>('foo'); // This looks more typesafe than it is 
// Good 
x = <string>fail('foo'); // Let's be honest with ourselves 
+1

좋은 대답! JS 형의 약속을 모델링하고 자동적으로 추론 된 '연쇄'체이닝을 허용하기 위해서 리턴 타입을 사용하여 generic 파라미터를 구동하는 것이 중요하다. – basarat