首页 > 解决方案 > 数组函数有些不缩小类型,即使使用类型谓词,替代解决方案?

问题描述

当使用类型谓词和返回语句时,我希望数组函数可以缩小 dashArray 的类型。

export function parseAsDashArray(str: string | null): number[] | null {
  if (!str) {
    return null;
  }

  const values = str.split(/[\s,]+/g);

  const dashArray = values.map((v) => parseAsPercentLength(v));

  if (dashArray.some(isNull)) {
    return null;
  }

  if (isOdd(dashArray.length)) {
    dashArray.concat(dashArray);
  }

  return dashArray;
}

export function isNull(val: any): val is null {
  return val === null;
}

export function parseAsPercentLength(val: string): number | null { ... }

编辑:这是我尝试粘贴到 TypeScript 游乐场的完整示例。

https://www.typescriptlang.org/play

function parseAsDashArray(str: string | null): number[] | null {
    if (!str) {
      return null;
    };

    const values = str.split(/[\s,]+/g);

    const dashArray = values.map(parseAsPercentLength);

    if (dashArray.some(el => el == null)) {
      return null;
    }

    if (dashArray.length % 2 == 1) dashArray.concat(dashArray);

    return dashArray;
}

function parseAsPercentLength(val: string): number | null { 
  return Number.parseFloat(val)
}

类型 '(number | null)[]' 不能分配给类型 'number[]'。输入'号码 | null' 不可分配给类型 'number'。“null”类型不能分配给“number”类型。

标签: arraystypescript

解决方案


export function parseAsDashArray(str: string | null): number[] | null {
  if (!str) {
    return null;
  }

  const values = str.split(/[\s,]+/g);

  const parsedArray = values.map((v) => parseAsPercentLength(v));
  const dashArray = parsedArray.filter(isValue);

  if (dashArray.length < parsedArray.length) {
    return null;
  }

  if (isOdd(dashArray.length)) {
    dashArray.concat(dashArray);
  }

  return dashArray;
}

推荐阅读