Реагируйте TypeScript: типы свойства 'X' несовместимы. Тип «Y» нельзя назначить типу «Z» - PullRequest
0 голосов
/ 16 сентября 2018

Я работаю над приложением React-TypeScript, создающим компонент ввода номера кредитной карты.Пока пользователь вводит номер кредитной карты, значок FontAwesome на входе должен обновлять изображение бренда.Я получаю эту ошибку:

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

Уже пробовал это решение, которое не работало для меня: https://github.com/FortAwesome/react-fontawesome/issues/143#issuecomment-410677960

Я думаю, что это проблема TypeScript, неправильные типы передаются icon prop.

Это упрощенная версия моего TSX-файла, может быть, это поможет:

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>
   );
  }
}

Так, как я могу исправить эту ошибку?

1 Ответ

0 голосов
/ 16 сентября 2018

вам нужно изменить это:

interface IState {
  cardIcon: IconProp;
}

Ошибка, которую вы получаете, заключается в том, что icon реквизит может принимать только подмножество string, равное IconProp.

Вы можете посмотреть определение здесь , которое включает в себя тип IconName в этом файле

...