배열 객체 형태

export const questionList = [
  {
    page: 1,
    question: '축사를 할 사람의\\n이름을 알려 주세요.',
    type: 'input',
    options: '이름을 작성해주세요.',
  },
  {
    page: 2,
    question: '축사를 받을 사람의\\n이름을 알려 주세요.',
    type: 'input',
    options: '이름을 작성해주세요.',
  },
  {
    page: 3,
    question: '축사를 받을 사람은\\n신랑인가요, 신부인가요?',
    type: 'image-card-button',
    options: ['신랑', '신부'],
  },
  {
    page: 4,
    question: '축사를 받는 사람을\\n뭐라고 부르면 좋을까요?',
    type: 'image-button',
    options: ['친구', '오빠', '언니', '동생', '형', '누나', '기타'],
  },
  {
    page: 5,
    question: '축사를 몇 분으로\\n하면 좋을까요?',
    type: 'primary-button',
    options: ['2분', '3분', '4분', '5분', '6분'],
  },
  {
    page: 6,
    question: '축사 말투는\\n어떻게 할까요?',
    type: 'primary-button',
    options: ['반말', '존댓말'],
  },
  {
    page: 7,
    question: '축사의 컨셉은\\n무엇인가요?',
    type: 'primary-button',
    options: ['감동', '행복', '재치', '차분', '눈물'],
  },
  {
    page: 8,
    question: '축사 중간에 들어갈 재밌는\\n에피소드가 있다면 알려 주세요.',
    type: 'textarea',
    options: 'ex. 오빠는 나에게 신부 언니와의 연애\\n고민 상담했다. (최대 500자)',
  },
  {
    page: 9,
    question: '축사에서 마지막으로 하고\\n싶은 말이 있다면 알려 주세요.',
    type: 'textarea',
    options: 'ex. 행복하게 잘 살아라! (최대 500자)',
  },
];
import Input from 'components/Input';
import ImageCardButton from 'components/Button/ImageCardButton';
import ImageButton from 'components/Button/ImageButton';
import PrimaryButton from 'components/Button/PrimaryButton';
import Textarea from 'components/Textarea';

type Props = {
  type: string;
  options: string | string[];
};

const SelectComponent = ({ type, options }: Props => {
  switch (type) {
    case 'input':
      return <Input placeholder={options} />;
    case 'image-card-button':
      return <ImageCardButton options={options} />;
    case 'image-button':
      return <ImageButton options={options} />;
    case 'primary-button':
      return <PrimaryButton options={options} />;
    case 'textarea':
      return <Textarea placeholder={options} />;
    default:
      return null;
  }
};

export default SelectComponent;
type Props = {
  placeholder: string;
};

const Input = ({ placeholder }: Props) => {
  return (
    <input
      className="text-gray600 h-11 w-[327px] rounded-[5px] bg-gray100 p-4 font-Pretendard text-[17px] font-medium placeholder-gray300 caret-indigo outline-indigo"
      placeholder={placeholder}
      maxLength={10}
    ></input>
  );
};

export default Input;

input에는 string으로했는데 selectComponent에는 배열 혹은 문자열이 올수있다고 지정해놔서 에러가남 반대로 input에다가 string | string[]을 해도 input jsx 형태 자체가 배열이 올수없는 형태라 에러가 남.

엄청난 삽질 후 제네릭도 시도해보고 인터페이스랑 섞어서도 해봤지만 실패

결론은 타입 단언으로 해결

import Input from 'components/Input';
import ImageCardButton from 'components/Button/ImageCardButton';
import ImageButton from 'components/Button/ImageButton';
import PrimaryButton from 'components/Button/PrimaryButton';
import Textarea from 'components/Textarea';

type Props = {
  type: string;
  options: string | string[];
};

const SelectComponent = ({ type, options }: Props): React.ReactNode => {
  switch (type) {
    case 'input':
      return <Input placeholder={options as string} />;
    case 'image-card-button':
      return <ImageCardButton options={options as string[]} />;
    case 'image-button':
      return <ImageButton options={options as string[]} />;
    case 'primary-button':
      return <PrimaryButton options={options as string[]} />;
    case 'textarea':
      return <Textarea placeholder={options as string} />;
    default:
      return null;
  }
};

export default SelectComponent;

해당 컴포넌트에는 무조건 이 타입이 들어간다고 선언해주는 것