打字/休息运算符是打字稿数组声明所必需的吗?

时间:2018-02-09 23:30:25

标签: javascript typescript

阅读一些看起来像这样的代码:

/*
 * C program to find all permutations of letters of a string
 */
#include <stdio.h>
#include <string.h> 

/* Function to swap values at two pointers */
void swap (char *x, char *y)
    {
    char temp;
    temp = *x;
    *x = *y;
    *y = temp;
}
/*  End of swap()  */

/*  Function to print permutations of string  */
void permute(char *a, int i, int n)
{
    int j;
    if (i == n)
        printf("%s\n", a);
    else {
        for (j = i; j <= n; j++)
        {
            swap((a + i), (a + j));
            permute(a, i + 1, n);
            swap((a + i), (a + j)); //backtrack
        }
    }
}

/*  The main() begins  */
int main()
{
    char a[20];
    int n;
    printf("Enter a string: ");
    scanf("%s", a);
    n = strlen(a);
    printf("Permutaions:\n"); 
    permute(a, 0, n - 1);
    getchar();
    return 0;
}

export function printAdd(...numbers: number[]) { alert(`Adding the numbers: ${numbers.join(', ')}`); } 中的...是否必要。 IIUC意味着数字是一个数组,但我们也用...numbers声明,所以看起来我们是双重浸入?

1 个答案:

答案 0 :(得分:1)

  

......数字是否必要?

不,但这个问题的答案完全取决于您对参数的预期用途。

在您引用的示例中,@Value("Hello there!")表示rest parameter。使用它将在指定类型的数组中调用函数时指定所有参数(在本例中类型为...)。请考虑以下示例函数和调用:

number

不使用rest参数指示编译器该函数期望接收类型为export function printAdd(...numbers: number[]) { alert(`Adding the numbers: ${numbers.join(', ')}`); } printAdd(1, 2, 3); // Valid because there are 0 or more arguments of type number printAdd([1, 2, 3]); // Not valid because there is a single argument and it is of type number[] 的单个参数。

number[]

通过分析Typescript编译器的输出,这一点变得更加明显。编译时,第一个例子变为:

export function printAdd(numbers: number[]) {
    alert(`Adding the numbers: ${numbers.join(', ')}`);
}

printAdd(1, 2, 3);    // Not valid because there are 3 arguments of type number
printAdd([1, 2, 3]);  // Valid because there is a single argument of type number[]

请注意arguments对象的使用。这是一个类似数组的对象,但它不是一个数组。这意味着您无法使用任何// COMPILER OUTPUT function printAdd() { var numbers = []; for (var _i = 0; _i < arguments.length; _i++) { numbers[_i] = arguments[_i]; } alert("Adding the numbers: " + numbers.join(', ')); } 方法。

第二个例子变为

Array.prototype

未使用// COMPILER OUTPUT function printAdd(numbers) { alert("Adding the numbers: " + numbers.join(', ')); } 对象且argumentsnumbers,因此Array方法可立即供使用。