TypeScript를 사용한 개방형 함수 인수


128

TypeScript 언어 의 주요 관심사 중 하나 인 IMO 는 기존의 바닐라 JavaScript 코드를 지원하는 것입니다. 이것은 내가 처음에 느꼈던 인상입니다. 완벽하게 유효한 다음 JavaScript 함수를 살펴보십시오.

참고 :이 접근 방식이 마음에 든다는 것은 아닙니다. 나는 이것이 유효한 JavaScript 코드라고 말하는 것입니다.

function sum(numbers) { 

    var agregatedNumber = 0; 
    for(var i = 0; i < arguments.length; i++) { 
        agregatedNumber += arguments[i];
    }

    return agregatedNumber;
}

따라서이 함수를 여러 인수와 함께 사용합니다.

console.log(sum(1, 5, 10, 15, 20));

그러나 TypeScript Playground 로 이것을 시도 하면 컴파일 시간 오류가 발생합니다.

나는 이것이 버그라고 가정하고 있습니다. 호환성 문제가 없다고 가정 해 봅시다. 그렇다면 개방형 인수를 사용하여 이러한 유형의 함수를 작성하는 방법이 있습니까? paramsC #의 기능과 같은 ?


2
궁금한 점이 있습니다. 왜 명명 된 numbers매개 변수가 있습니까? 당신은 그것으로 아무것도하고 있지 않습니다.
Justin Morgan

1
@JustinMorgan이 하나 이상의 매개 변수를 가지고 있으면 Intellisense는 최소한 몇 가지 인수가 있어야 함을 암시합니다.
drzaus

답변:


268

이를 수행하는 TypeScript 방법은 ...인수 이름 앞에 줄임표 연산자 ( ) 를 배치하는 것 입니다. 위의 내용은 다음과 같이 작성됩니다.

function sum(...numbers: number[]) {
    var aggregateNumber = 0;
    for (var i = 0; i < numbers.length; i++)
        aggregateNumber += numbers[i];
    return aggregateNumber;
}

그런 다음 올바르게 입력합니다.

console.log(sum(1, 5, 10, 15, 20));

큰! 감사. 이것은 확실히 갈 길이다. 따라서 누군가 내 질문과 같이 기존 코드가 있으면 중단됩니다. 권리?
tugberk

1
예. 호출에 대해 불평하지만 서명을 sum (...)으로 변경하여 모든 유형의 여러 매개 변수를 수락하는 것으로 sum을 선언 할 수 있습니다. 대신 오류가 조용해집니다. CodePlex에 버그로 제출해 주시기 바랍니다.
chuckj

1
나머지 매개 변수 예를 찾고있었습니다. Ty.
AM

5

@chuckj 답변 외에도 : arrow function expressionTypeScript ( lambdaJava / .NET에서 일종의)를 사용할 수도 있습니다.

function sum(...nums: number[]): number {
    return nums.reduce((a, b) => a + b, 0);
}

4

Typescript에서는 Rest Parameter 의 개념으로 유사한 유형의 여러 값을받는 매개 변수입니다. typescript를 대상으로하는 경우 ECMAScript 6 표준 코드를 작성해야하며 typescript transpiler는이를 동등한 Java 스크립트 코드로 변환합니다 ( 이는 ECMAScript 5 표준입니다). typescript를 사용하면 함수 sum (... numbers : number [])과 같은 restparameter 변수 이름과 함께 3 개의 dot (...) preferx를 사용해야합니다.

참고 : 나머지 매개 변수는 매개 변수 목록의 마지막 매개 변수 여야합니다. 마찬가지로 함수 sum (name : string, age : number, ... numbers : number []).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.