数组类型保护技巧

时间:2018-06-13 14:24:51

标签: arrays typescript

目前为了保护阵列类型,我使用2个函数

贪婪的人:

export function isPureArrayOf<T>(array: any[], func: Function): array is T[] {
  for (const item of array) {
    if (!(item instanceof func)) {
      return false;
    }
  }

  return true;
}

一个不安全的人:

export function isArrayOf<T>(array: any[], func: Function): array is T[] {
  if (array.length === 0 || array[0] instanceof func) {
    return true;
  }

  return false;
}

我有两个问题:

是否有更好的方法来保护数组类型?

我可以将func链接到通用T吗?因为目前没有什么能阻止我写出像isPureArrayOf<String>(array, Number)那样完全错误的东西。

2 个答案:

答案 0 :(得分:3)

您的函数是为数组创建类型保护的好方法,我知道没有更好的方法来实现这一点。唯一的改进确实是将func绑定到需要构造函数签名的T的可能性:

function isPureArrayOf<T>(array: any[], func: new ()=>T): array is T[] {
    // ...
}  

答案 1 :(得分:0)

记录。

我已经更新了接受基本类型的技巧(Symbol除外):

function createTestType(func: Function) {
  if (func === Number || func === String || func === Boolean) {
    // Primitive type
    const expected = func.name.toLowerCase();

    return item => typeof item === expected;
  }

  return item => item instanceof func;
}

export function isPureArrayOf<T>(
  array: any[],
  func: new () => T
): array is T[] {
  const testType = createTestType(func);
  for (const item of array) {
    if (!testType(item)) {
      return false;
    }
  }

  return true;
}