来自TypeScript的Redux Action Creator功能参数误报?

时间:2019-10-26 10:42:40

标签: typescript redux

我已经在函数参数中添加了TypeScript类型。我不知道这是否重要,但是此功能是Redux Action Creator:

export const moveLayerUp = ({ index }: { index: number }) => {
  return {
    type: TYPES.MOVE_LAYER_UP,
    index
  };
};

要检查它是否正常运行,我将类型更改为字符串,但我希望该字符串会出错。但是它仍然可以正常工作:

export const moveLayerUp = ({ index }: { index: string }) => {
  return {
    type: TYPES.MOVE_LAYER_UP,
    index
  };
};

我从Redux开发工具中可以看到该函数被严格调用。类型错误时应该出错吗?

我使用带有--typescript标志的Create React App创建项目。在tsconfig中,我将"strict": false设置为我想添加合适的类型,而不是一直添加。

更新:调用它的函数是这样:

  const handleUp = () => {
    moveLayerUp({ index });
  };

1 个答案:

答案 0 :(得分:0)

这取决于如何声明在handleUp中使用的索引。如果它变成“ any”类型,则TypeScript会将其视为JavaScript变量,并且非常宽容。它将像JavaScript一样允许进行鸭式化。从您在评论中所说的听起来,这就是问题所在。

请考虑以下代码。这样可以在TypeScript中编译良好。索引的声明使其类型为“ any”,并且在将其传递到moveLayerUp时将其转换为字符串。因此,在moveLayerUp中为index =“ 1”。

const moveLayerUp = ({ index }: { index: string }) => { }

function callMoveLayerUp() {
    var index;
    index = 1;
    moveLayerUp({ index });
}

现在考虑以下代码:

const moveLayerUp = ({ index }: { index: string }) => { }

function callMoveLayerUp() {
    var index: number;
    index = 1;
    moveLayerUp({ index });
}

唯一的区别是索引声明为“数字”类型。该代码不会在TypeScript中编译。在对moveLayerUp的调用中遇到错误,“类型'数字'无法分配给类型'字符串'。索引明确是一个数字,因此您不能调用期望它为字符串的函数。

这就是为什么最好在TypeScript中声明所有变量的类型。