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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.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
有没有一种方法可以使TypeScript缩小一个基于某个用作缩小提示的布尔变量的联合类型_Typescript - Fatal编程技术网

有没有一种方法可以使TypeScript缩小一个基于某个用作缩小提示的布尔变量的联合类型

有没有一种方法可以使TypeScript缩小一个基于某个用作缩小提示的布尔变量的联合类型,typescript,Typescript,上面的代码运行良好。但是我想重构它,这样就不会每次都计算typeofexpression,因为list数组可能非常大。所以我用布尔变量重写了这段代码,如下所示: type Callback = (item: number) => number; const foo = (list: number[], value: Callback | number) => { return list.map(item => typeof value === 'function'

上面的代码运行良好。但是我想重构它,这样就不会每次都计算
typeof
expression,因为
list
数组可能非常大。所以我用布尔变量重写了这段代码,如下所示:

type Callback = (item: number) => number;

const foo = (list: number[], value: Callback | number) => {
  return list.map(item =>
    typeof value === 'function'? value(item) : value
  );
};
但我得到了一个错误:

此表达式不可调用。并非所有类型的成分
'number | Callback'
是可调用的。 类型
“number”
没有呼叫签名<代码>ts(2349)


您可以像这样使用
if
语句

type Callback = (item: number) => number;

const foo = (list: number[], value: Callback | number) => {
  const isFn = typeof value === 'function';
  return list.map(item =>
    isFn? value(item) : value
  );
};

打字脚本在某些情况下是愚蠢的。。。 你应该明确地告诉他会是哪种类型

const foo = (list: number[], value: Callback | number) => {
 if(typeof value === 'function')
   return list.map(item => value(item));
 return list.map(item => value);
};

在这种情况下,只需编写
list.map(value)
就更简单了。遗憾的是,您的解决方案不适用于我的实际代码,因为我的代码有点复杂(它有嵌套表达式)。不过,你的答案很好地解决了上述问题。
list.map(typeof value===“function”?value:item=>value)
?@kaya3将其作为答案发布如何?它与我投赞成票的公认答案太相似了。
type Callback = (item: number) => number;

const foo = (list: number[], value: Callback | number) => {
  const isFn = typeof value === 'function';
    return list.map(item =>
      isFn? (value as Callback)(item) : value
    );
};