Typescript没有正确省略类型
我试图创建一个函数,它要么接受一个数字,要么接受字符串“last”,并使用数组中相应的元素 我处理输入为“last”的情况 我添加了一个简化的示例 我在Typescript没有正确省略类型,typescript,Typescript,我试图创建一个函数,它要么接受一个数字,要么接受字符串“last”,并使用数组中相应的元素 我处理输入为“last”的情况 我添加了一个简化的示例 我在返回状态[I]行上得到一个错误 我尝试将分派…移动到带有(typeof I=='number')的if块,但这也不起作用 export function moveTo(i: number | 'last') { return (dispatch: Function, getState: ()=>string[]) => {
返回状态[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'
类型
常量
,则在嵌套函数表达式和箭头函数中仍然可以通过/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];
}
})
};
}