Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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,我试图创建一个函数,它要么接受一个数字,要么接受字符串“last”,并使用数组中相应的元素 我处理输入为“last”的情况 我添加了一个简化的示例 我在返回状态[I]行上得到一个错误 我尝试将分派…移动到带有(typeof I=='number')的if块,但这也不起作用 export function moveTo(i: number | 'last') { return (dispatch: Function, getState: ()=>string[]) => {

我试图创建一个函数,它要么接受一个数字,要么接受字符串“last”,并使用数组中相应的元素

我处理输入为“last”的情况

我添加了一个简化的示例

我在
返回状态[I]
行上得到一个错误

我尝试将
分派…
移动到带有
(typeof I=='number')
的if块,但这也不起作用

export function moveTo(i: number | 'last') {
  return (dispatch: Function, getState: ()=>string[]) => {
    const state = getState();
    if (i === 'last') {
      i = state.length - 1;
    }
    dispatch({
      index: i, //here i is shown to be number on hover
      effect() {
        return state[i]; // index expression is not of type number (shows as number | 'last')
      }
    });
  };
}

在if语句之后,我想断言
I
number
,这样我就不必在effect函数的任何地方都使用
作为number

因为
I
可以是
字符串
数字
林特很难理解转换。一种解决方案是使用另一个变量:

export function moveTo(i: number | 'last') {
  return (dispatch: Function, getState: ()=>string[]) => {
    const state = getState();
    const index: number = (i == 'last') ? state.length - 1 : i;

    dispatch({
      index,
      effect() {
        return state[index];
      }
    });
  };
}

同样,对于同一个变量有多个类型也是一件坏事(因为这样的事情可能会发生),我建议使用
-1
而不是
'last'
来保持
数字
类型。

效果
回调中
I
的类型没有缩小,因为
i
被认为是函数
moveTo
的可变参数

这意味着,当稍后调用
effect
回调时,编译器无法确保
i
仍然具有
number
类型。因此,
if(i=='last'){i=state.length-1;}
导致的类型保护无效,并且
i
在回调中获取初始的
number |'last'
类型

何时TS将函数参数视为<代码> const ? 函数参数是,直到您为函数或嵌套函数中的某个位置的参数赋值。如果参数是隐式的
常量
,则在嵌套函数表达式和箭头函数中仍然可以通过/type来访问其狭窄类型。因此,这种人为的工作:

现在该怎么办


您最好的选择可能是(也请参见@D.Nathanel的答案),这会产生比回调中的数字类型更一致的类型。不建议重新分配函数参数,因此您可以通过将
i
视为不可变来将其视为代码的一点机会。

但它可以在
index:i
行中推断i是编号
调度中的
index
属性未键入,它是一个自由对象。当dispatch被键入时也会发生同样的事情哇,是的,好像把它放在另一个变量中。可能调用函数
effect
时会计算
i
。您可以执行
state[this.index]
而不是
state[i]
,这似乎解决了问题。
export function moveTo(i: number | 'last') {
  return (dispatch: Function, getState: () => string[]) => {
    if (i !== 'last')
      dispatch({
        index: i,
        effect() {
          return getState()[i];
        }
      })
  };
}