【问题标题】:TypeScript - typeof array of union typesTypeScript - 联合类型的 typeof 数组
【发布时间】:2016-08-26 13:29:00
【问题描述】:

如果我有联合数组,我可以通过这种方式检查 typeof 值:

//case 1
function something1(a1: Array<number | string | boolean>)
{
    for (const v of a1)
        if (typeof v === "number")
            v;  //v is number
        else if (typeof v === "boolean")
            v;  //v is boolean
        else
            v;  //v is string
}

如果我有数组联合,我可以这样做:

//case 2
function something2(a1: Array<number> | Array<string> | Array<boolean>)
{
    for (const v of a1)
        if (typeof v === "number")
            v;  //v is number
        else if (typeof v === "boolean")
            v;  //v is boolean
        else
            v;  //v is string
}

但我想避免检查循环内的类型:

//case 3
function something3(a1: Array<number> | Array<string> | Array<boolean>)
{
    if (a1.length === 0)
        return;
    if (typeof a1[0] === "number")
        a1;  //should be number[]!!     but it is  number[] | string[] | boolean[]
    if (typeof a1[0] === "boolean")
        a1;  //should be boolean[]!!    but it is  number[] | string[] | boolean[]
    if (typeof a1[0] === "string")
        a1;  //should be string[]!!     but it is  number[] | string[] | boolean[]
}

但 a1 不被识别为 number[] 或 string[] 或 boolean[]。
但这是有道理的。由于数组中的所有项目都是相同的类型。有可能实现吗?

我正在使用 TypeScript beta 2.0。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    type guards:

    function something3(a1: Array<number> | Array<string> | Array<boolean>) {
        if (a1.length === 0)
            return;
        if (isArrayOfNumbers(a1))
            a1[0].toExponential();
        if (isArrayOfBooleans(a1))
            a1[0].valueOf();
        if (isArrayOfStrings(a1))
            a1[0].indexOf('abc');
    }
    
    function isArrayOfNumbers(arr: number[] | string[] | boolean[]) : arr is number[] {
        return arr.length > 0 && typeof arr[0] === 'number';
    }
    
    function isArrayOfBooleans(arr: number[] | string[] | boolean[]) : arr is boolean[] {
        return arr.length > 0 && typeof arr[0] === 'boolean';
    }
    
    function isArrayOfStrings(arr: number[] | string[] | boolean[]) : arr is string[] {
        return arr.length > 0 && typeof arr[0] === 'string';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-25
      • 2022-06-10
      • 2021-04-19
      • 2018-09-28
      • 1970-01-01
      • 2022-11-18
      • 2019-02-04
      • 1970-01-01
      相关资源
      最近更新 更多