如何在采用数组并集的函数中优化类型?

时间:2018-11-04 14:04:44

标签: javascript arrays flowtype

有些函数根据输入数组的类型将作业委派给其他函数。如何指出特定的数组必须由特定的函数处理?

我一直在考虑并搜索了几个小时,但找不到解决方案。

type nameType = {
  name: string,
}

type surnameType = {
  surname: string
};

type inputType = nameType[] | surnameType[];

function processSurnames(suranmes: surnameType[]) {
  let result = {};
  // do something with surnames
  return result;
}

function processNames(names: nameType[]) {
  let result = {};
  // do something with names
  return result;
}

function process(input: inputType) {
  if (typeof input[0].name === 'string') { // <--- this refinement doesn't work
    return processNames(input);
  } else {
    return processSurnames(input);
  }
}

the code on flow.org/try

2 个答案:

答案 0 :(得分:1)

无法根据数组中项目的类型进行优化。

这是因为array access is unsafe -总是有可能通过数组访问返回undefined。可以使用数组以外的任何东西进行优化。

我已经重写了您的示例,将数组包装在对象中,并根据“ type”属性进行了优化。

// ...

type Names = { type: "names", list: nameType[] }
type Surnames = { type: "surnames", list: surnameType[] }

// ...

export function process(input: Names | Surnames) {
  if (input.type === "names") {
    return processNames(input.list)
  } else {
    return processSurnames(input.list)
  }
}

Here is the try flow link

不幸的是:(

答案 1 :(得分:0)

您尝试过instanceof吗? 这是什么意思不起作用?您是否检查过输入[0] .name返回的类型?