diff --git a/app/javascript/flavours/glitch/components/icon.jsx b/app/javascript/flavours/glitch/components/icon.jsx
deleted file mode 100644
index d3d7c591d6..0000000000
--- a/app/javascript/flavours/glitch/components/icon.jsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import React from 'react';
-import PropTypes from 'prop-types';
-import classNames from 'classnames';
-
-export default class Icon extends React.PureComponent {
-
-  static propTypes = {
-    id: PropTypes.string.isRequired,
-    className: PropTypes.string,
-    fixedWidth: PropTypes.bool,
-  };
-
-  render () {
-    const { id, className, fixedWidth, ...other } = this.props;
-
-    return (
-      <i className={classNames('fa', `fa-${id}`, className, { 'fa-fw': fixedWidth })} {...other} />
-    );
-  }
-
-}
diff --git a/app/javascript/flavours/glitch/components/icon.tsx b/app/javascript/flavours/glitch/components/icon.tsx
new file mode 100644
index 0000000000..d85fff6ef6
--- /dev/null
+++ b/app/javascript/flavours/glitch/components/icon.tsx
@@ -0,0 +1,14 @@
+import React from 'react';
+import classNames from 'classnames';
+
+type Props = {
+  id: string;
+  className?: string;
+  fixedWidth?: boolean;
+  children?: never;
+  [key: string]: any;
+}
+export const Icon: React.FC<Props> = ({ id, className, fixedWidth, ...other }) =>
+  <i className={classNames('fa', `fa-${id}`, className, { 'fa-fw': fixedWidth })} {...other} />;
+
+export default Icon;
diff --git a/app/javascript/flavours/glitch/components/icon_with_badge.jsx b/app/javascript/flavours/glitch/components/icon_with_badge.jsx
deleted file mode 100644
index a42ba45892..0000000000
--- a/app/javascript/flavours/glitch/components/icon_with_badge.jsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import React from 'react';
-import PropTypes from 'prop-types';
-import Icon from 'flavours/glitch/components/icon';
-
-const formatNumber = num => num > 40 ? '40+' : num;
-
-const IconWithBadge = ({ id, count, issueBadge, className }) => (
-  <i className='icon-with-badge'>
-    <Icon id={id} fixedWidth className={className} />
-    {count > 0 && <i className='icon-with-badge__badge'>{formatNumber(count)}</i>}
-    {issueBadge && <i className='icon-with-badge__issue-badge' />}
-  </i>
-);
-
-IconWithBadge.propTypes = {
-  id: PropTypes.string.isRequired,
-  count: PropTypes.number.isRequired,
-  issueBadge: PropTypes.bool,
-  className: PropTypes.string,
-};
-
-export default IconWithBadge;
diff --git a/app/javascript/flavours/glitch/components/icon_with_badge.tsx b/app/javascript/flavours/glitch/components/icon_with_badge.tsx
new file mode 100644
index 0000000000..487bf326ad
--- /dev/null
+++ b/app/javascript/flavours/glitch/components/icon_with_badge.tsx
@@ -0,0 +1,20 @@
+import React from 'react';
+import { Icon } from './icon';
+
+const formatNumber = (num: number): number | string => num > 40 ? '40+' : num;
+
+type Props = {
+  id: string;
+  count: number;
+  issueBadge: boolean;
+  className: string;
+}
+const IconWithBadge: React.FC<Props> = ({ id, count, issueBadge, className }) => (
+  <i className='icon-with-badge'>
+    <Icon id={id} fixedWidth className={className} />
+    {count > 0 && <i className='icon-with-badge__badge'>{formatNumber(count)}</i>}
+    {issueBadge && <i className='icon-with-badge__issue-badge' />}
+  </i>
+);
+
+export default IconWithBadge;