2017-09-13 4 views
0

과부하가있는 함수가 있습니다.TypeScript 오버로드 및 선택적 인수

function foo(x: number, y: void): void; 
function foo(x: number, y: number | string): number; 
function foo(x: number, y: any) { 
    if (typeof y === "undefined") { 
     return; 
    } 
    return typeof y === "string" 
     ? x/parseFloat(y) 
     : x/y; 
} 

대신 y에 대한 선택적 인수를 사용하는, 내가 특별히 반환 값을 지정 void를 사용합니다. 의도 된 사용 사례에는 undefined을 두 번째 인수로 사용하는 사례가 포함됩니다. 다른 함수에서

, 나는 그렇게 같이 호출합니다 :

function bar(x: number, y?: number | string) { 
    const f = foo(x, y); 
    // Some other stuff 
} 

이 다음과 같은 유형의 오류가 발생합니다

Argument of type 'string | number | undefined' is not assignable to parameter of type 'string | number'. 
    Type 'undefined' is not assignable to type 'string | number'. 

나의 이해는 foo가 두 번째 인수 string | number | void으로 수행하게되었다, bar을 호출하면 string, number 또는 void 중 하나가 전달되고 TypeScript는 foo ' 반환 값.

의도 한 효과를 얻는 올바른 방법은 무엇입니까?

답변

1

컴파일러가 모두 가능하기 때문에 유형 number | string 또는 undefined이 될 것 ybar 내부 여부를 알 수있는 방법이 없습니다. 컴파일러가 이것을 파악할 수 없다면 올바른 오버로드를 선택할 수있는 방법이 없습니다.

어설 yundefined 할 수 없다는 : 당신은 컴파일러에 더 도움을 제공해야

function bar(x: number, y?: number | string) { 

    // Picks `function foo(x: number, y: number | string): number;` overload 
    const f = foo(x, y!); // Use the non-null assertion operator here. 
    // Some other stuff 
} 

또는 사용 type guards :

function bar(x: number, y?: number | string) { 

    if (y === undefined) { 
     // Picks `function foo(x: number, y: void): void;` overload 
     foo(x, y); 
    } 
    else { 
     // Picks `function foo(x: number, y: number | string): number;` overload 
     const a = foo(x, y); 
    } 
    // Some other stuff 
}