Как эта аннотация типа работает в коде React без TypeScript?

Я смотрел этот пример кода на странице ReactRouter, и этот фрагмент интересен:

const PrivateRoute = ({ component: Component, ...rest }) => (
  <Route
    {...rest}
    render = {props =>
      fakeAuth.isAuthenticated ? (
        <Component {...props} />
      ) : (
        <Redirect
          to = {{
            pathname: "/login",
            state: { from: props.location }
          }}
        />
      )
    }
  />
);

Часть component: Component выглядит как аннотация типа. Webstorm не жаловался, когда я помещал этот пример в пустой файл, но я не видел, чтобы они использовали Flow, TypeScript или что-то еще в импорте.

Есть ли в JavaScript аннотации типов? Я ничего не видел в MDN по этому поводу, когда искал, а также React не предоставляет автоматически аннотацию типа, исходя из того, что я узнал ...

Это псевдоним ES6, значит, это действительный Javascript.

Jozef Cipa 16.09.2018 09:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
332
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это не аннотация типа. Это функция ES6 под названием деструктуризация остальных параметров:

Сначала рассмотрим этот пример: (назначение деструктуризации)

const test = myObject.prop
// prop can be assigned in a variable
const { prop } = myObject
// but we want prop as a test variable
// and can be written as
const { prop: test } = myObject
// which is similar to first line
console.info(test)

Вот как мы можем передать параметры:

({ component, ...rest })

// We're giving component name as Component

({ component: Component, ...rest })

Итак, вы можете использовать <Component />, поскольку вы знаете, что компонент нижнего регистра <component /> недействителен в реакции.


Кроме того, я бы посоветовал вам глубоко погрузиться в следующие блоги:

Hackernoon: понимание задачи деструктуризации

Информация о JavaScript: назначение деструктуризации

Codeburst: Destructuring assignment полное руководство

Dev.to: Назначение деструктуризации - массив

Dev.to: Назначение деструктуризации - объект

Ответ принят как подходящий

Вы видите не аннотацию типа, а свойство в шаблоне объекта. Давайте упростим ваш пример, чтобы понять, что происходит.

Вот функция, которую легко понять:

f = (h) => [h.x, h.y]

Функция f принимает объект h и возвращает массив с h.x и h.y. Теперь в современном JavaScript не нужно передавать объект и разбивать его на части в теле функции. Вместо этого мы делаем раздел параметров функции шаблон, чтобы нам вообще не нужно было беспокоиться об этой переменной h. Итак, мы могли бы переписать его так (аналогично вашему примеру):

f = ({x: xValue, y: yValue}) => [xValue, yValue]

Таким образом, как и раньше, вы можете передать в f любой объект, имеющий свойства x и y, и он вернет массив значений этих свойств.

Вот он в действии:

> f = (h) => [h.x, h.y]
[Function: f]
> f({x:1, y:2, z:3})
[ 1, 2 ]
> f = ({x: xValue, y: yValue}) => [xValue, yValue]
[Function: f]
> f({x:1, y:2, z:3})
[ 1, 2 ]

В стороне, обычно можно пропустить части xValue и yValue и получить:

f = ({x: x, y: y}) => [x, y]

что из-за сокращенной записи свойств просто:

f = ({x, y}) => [x, y]

но, как пишет @BhojendraRauniyar в другом ответе, в структуре, с которой используется этот код, есть соглашения о капитализации.

Другие вопросы по теме