Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

React TypeScript: Types of property 'X' are incompatible. Type 'Y' is not assignable to type 'Z'

I am working on React-TypeScript app, creating credit card number imput component. While the user is entering a credit card number, the FontAwesome icon inside input should update to the brand image. I'm getting this error:

Types of property 'icon' are incompatible.
  Type 'string' is not assignable to type 'IconProp'

Already tried this solution that didn't worked for me: https://github.com/FortAwesome/react-fontawesome/issues/143#issuecomment-410677960

I thinks this is TypeScript issue, wrong types being passed to icon prop.

This is simplified version of my tsx file, maybe it helps:

import { faCreditCard } from '@fortawesome/fontawesome-free-solid';
import { faCcMastercard, faCcVisa } from '@fortawesome/free-brands-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';

const CARD_TYPES: { [index: string]: string } = {
  mastercard: 'MASTERCARD',
  visa: 'VISA',
};
const CARD_ICONS: { [index: string]: any } = {
  mastercard: faCcMastercard,
  placeholder: faCreditCard,
  visa: faCcVisa,
};

interface IProps {
  placeholder: string;
  icon: string;
}

interface IState {
  cardIcon: string;
}

export default class CardNumber extends Component<IProps,IState
> {

  constructor(props: IWmxCardNumberProps) {
   super(props);
   this.state = {
    cardIcon: CARD_ICONS.placeholder,
   };
  }

  componentDidMount() {
   this.setState({
    cardIcon: CARD_ICONS[cardType] || CARD_ICONS.placeholder
   });
  }

  onCardNumberChange(e: any) {
   this.setState({
    cardIcon: CARD_ICONS[cardType] || CARD_ICONS.placeholder
   });
  }

  public render() {
   const { cardIcon } = this.state;
   const { placeholder } = this.props;

   return (
    <Container>
     <FieldWrapper>
      <InputWrapper data-max="9999 9999 9999 9999 9999">
        {/* Error: Types of property 'icon' are incompatible. Type 'string' is not assignable to type 'IconProp' */}
        <FontAwesomeIcon icon={cardIcon} className="credit-card-icon" />
        <Input
          type="tel"
          placeholder={placeholder}
          onChange={this.onCardNumberChange}
        />
      </InputWrapper>
     </FieldWrapper>
    </Container>
   );
  }
}

So how can i fix this error?

like image 247
Paulius Rimgaila Avatar asked Sep 16 '18 20:09

Paulius Rimgaila


1 Answers

you need to change this:

interface IState {
  cardIcon: IconProp;
}

The error you are getting is because the icon prop can only take a subset of string which is IconProp.

You can look at the definition here which includes the type IconName in this file

like image 53
Kevin Amiranoff Avatar answered Oct 06 '22 01:10

Kevin Amiranoff