Ложные срабатывания из TypeScript для параметров функции Redux Action Creator? - PullRequest
0 голосов
/ 26 октября 2019

Я добавил тип 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, что эта функция вызывающе вызывается. Должно ли это быть ошибкой, когда тип неправильный?

Я использовал Create React App с флагом --typescript для создания проекта. В tsconfig я устанавливаю "strict": false, поскольку хочу добавлять типы, как мне кажется, а не постоянно.

ОБНОВЛЕНИЕ: функция, которая вызывает это:

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

1 Ответ

0 голосов
/ 26 октября 2019

Зависит от того, как индекс объявлен для использования в handleUp. Если он имеет тип 'any', тогда TypeScript рассматривает его как переменную JavaScript и очень простителен. Это позволит использовать ducktyping, как в JavaScript. Из того, что вы говорите в своем комментарии, звучит, как будто это проблема.

Рассмотрим код нижеЭто прекрасно компилируется в TypeScript. Объявление index делает его типом any, и оно передается в string при передаче в moveLayerUp. Поэтому index = "1" в moveLayerUp.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...