Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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 - Fatal编程技术网

Arrays 阵列式守卫技巧

Arrays 阵列式守卫技巧,arrays,typescript,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; } 导出函数isPureArrayOf(数组:any

目前,为了保护数组类型,我使用了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;
}
导出函数isPureArrayOf(数组:any[],func:function):数组是T[]{
for(数组的常量项){
如果(!(功能的项目实例)){
返回false;
}
}
返回true;
}
而且是不安全的:

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

  return false;
}
导出函数isArrayOf(数组:any[],func:function):数组是T[]{
if(array.length==0 | | array[0]instanceof func){
返回true;
}
返回false;
}
关于这一点,我有两个问题:

是否存在更好的方法来保护数组类型


我可以用某种方式将func链接到泛型T吗?因为目前没有任何东西阻止我写类似于
isPureArrayOf(array,Number)
的东西,这是完全错误的

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

function isPureArrayOf<T>(array: any[], func: new ()=>T): array is T[] {
    // ...
}  
函数isPureArrayOf(数组:any[],func:new()=>T):数组是T[]{
// ...
}  
用于记录

我已经更新了接受原语类型的技巧(除了
Symbol
):

函数createTestType(func:function){
if(func==Number | | func==String | | func==Boolean){
//原始类型
const expected=func.name.toLowerCase();
返回项目=>typeof项目===预期;
}
return item=>func的item instanceof;
}
导出函数isPureArrayOf(
数组:任意[],
func:new()=>T
):数组为T[]{
const testType=createTestType(func);
for(数组的常量项){
如果(!testType(项目)){
返回false;
}
}
返回true;
}

除非你能更早地执行,否则你必须在速度和正确性之间进行权衡。是的,这就是为什么我要使用两个函数,第一个是当我不控制上游时,第二个是当我只需要让typescript满意时(比如优化联合)。谢谢,这正是我想要的。这实际上消除了在调用guard(
isPureArrayOf(array,Class)
而不是
isPureArrayOf(array,Class)
)时显式显示泛型的需要,因为后者不太容易出错。@Bastien是的,
T
将从构造函数返回类型中推断出来,无需再指定它
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;
}