Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 数组类型的类型保护_Arrays_Typescript_Types - Fatal编程技术网

Arrays 数组类型的类型保护

Arrays 数组类型的类型保护,arrays,typescript,types,Arrays,Typescript,Types,对非数组类型使用typeof类型保护非常简单(示例如下所示): 然而,当涉及到数组类型时,它变得更加复杂。 我假设以下代码可以工作: function join(array: number[] | string[]): string { if (typeof array[0] === 'number') { return foo(array); } else { return bar(array) } } function foo(n:

对非数组类型使用
typeof
类型保护非常简单(示例如下所示):

然而,当涉及到数组类型时,它变得更加复杂。 我假设以下代码可以工作:

function join(array: number[] | string[]): string {
    if (typeof array[0] === 'number') {
        return foo(array);
    } else {
        return bar(array)
    }
}

function foo(n: number[]): string {
    return n.join();
}

function bar(s: string[]): string {
    return s.join();
}
对我来说似乎很简单:预期的类型是数字数组或字符串数组。
如果数组中第一个元素的类型为
number
,则数组的类型为
number[]
。否则,这是一个字符串数组

不幸的是,TypeScript编译器没有那么聪明,我得到了一个编译错误:

“number[]| string[]”类型的参数不能分配给参数 类型为“string[]”


如何使其工作?

答案是用户定义的类型保护

您可以定义自己的类型保护,以确定数组是否为数字数组:

function isNumbers(array: number[] | string[]): array is number[] {
    return typeof array[0] === 'number'
}
阅读有关用户定义类型保护的更多信息

以下是代码的工作示例:

function join(array: number[] | string[]): string {
    if (isNumbers(array)) {
        return foo(array);
    } else {
        return bar(array)
    }
}

function foo(n: number[]): string {
    return n.join();
}

function bar(s: string[]): string {
    return s.join();
}

function isNumbers(array: number[] | string[]): array is number[] {
    return typeof array[0] === 'number'
}

TypeScript Playerd.

JeB的回答对我来说是一个很好的开始,但我需要一些更健壮的东西,因为我必须处理任意输入。以下是我的想法:

function isNumberArray(value : unknown) : value is number[] {
    if (!Array.isArray(value)) {
        return false;
    }

    if (value.some((v) => typeof v !== "number")) {
        return false;
    }

    return true;
}
function isNumberArray(value : unknown) : value is number[] {
    if (!Array.isArray(value)) {
        return false;
    }

    if (value.some((v) => typeof v !== "number")) {
        return false;
    }

    return true;
}