确保参数是一个数组

时间:2017-05-31 00:56:18

标签: javascript arrays typescript

我正试图找到一种方法来检查函数参数是否是数组。如果不是,请将其转换为数组并对其执行功能,否则只需对其执行一项功能。

示例:

interface employee {
    first: string,
    last: string
}

function updateEmployees (emp: employee | employee[]) {
    let employees = [];
    if (emp instanceof Array) employees = [emp];
    else employees = emp;
    employees.forEach(function(e){
        return 'something'
    })
}

这似乎对我有用,但却警告Type 'employee' is not assignable to type 'any[]'. Property 'length' is missing in type 'employee'.

2 个答案:

答案 0 :(得分:5)

以下是您的功能的固定版本:

function updateEmployees (emp: employee | employee[]) {
    let employees: employee[] = [];
    if (emp instanceof Array) employees = emp;
    else employees = [emp];
    employees.forEach(function(e){
        return 'something'
    })
}

但它可以更短:

function updateEmployees(emp: employee | employee[]) {
    (emp instanceof Array ? emp : [emp]).forEach(function(e){
        return 'something'
    })
}

答案 1 :(得分:0)

这是一个确保数组的类型安全函数,(使用 Typescript)。它还检查项目是 null 还是 undefined,如果是,则返回空数组,而不是将其添加到数组中。

function ensureArray<T>(value: T | T[]): T[] {
  if (Array.isArray(value)) {
    return value
  } else if (value === undefined || value === null) {
    return []
  } else {
    return [value]
  }
}

如果你确实想要一个包含 null 或 undefined 的数组:

function ensureArray<T>(value: T | T[]): T[] {
  if (Array.isArray(value)) {
    return value
  } 
  else {
    return [value]
  }
}

对于您的示例,用法是:

function updateEmployees (emp: employee | employee[]) {
    ensureArray(emp).forEach(function(e){
        return 'something'
    })
}

请注意,nullundefined 元素不会使用附加检查创建运行时错误。您循环中的项目现在属于“员工”类型。