MST

星途 面试题库

面试题:React组件库开发中TypeScript的高级类型应用

假设你正在开发一个通用的React组件库,其中有一个`Form`组件,它可以接收各种不同类型的表单字段配置。表单字段配置可能是文本输入框、下拉框、单选框等,每个配置对象有通用的`id`、`label`属性,以及根据不同类型字段的特定属性(如文本输入框的`type`为`text`,下拉框的`options`数组等)。使用TypeScript的高级类型(如联合类型、交叉类型、条件类型等)来定义这个`Form`组件接收的`props`类型,使得组件能够灵活且类型安全地处理各种表单字段配置。同时,简要说明如何使用这些类型定义来编写`Form`组件的渲染逻辑。
19.6万 热度难度
前端开发React

知识考点

AI 面试

面试题答案

一键面试
  1. 定义Form组件接收的props类型
    • 首先定义各种表单字段的公共属性接口:
    interface CommonFieldProps {
        id: string;
        label: string;
    }
    
    • 然后分别定义不同类型表单字段的特有属性接口:
      • 文本输入框:
      interface TextInputFieldProps extends CommonFieldProps {
          type: 'text';
          // 可以添加更多文本输入框特有的属性,比如 placeholder 等
          placeholder?: string;
      }
      
      • 下拉框:
      interface SelectFieldProps extends CommonFieldProps {
          type:'select';
          options: { label: string; value: string | number }[];
      }
      
      • 单选框:
      interface RadioFieldProps extends CommonFieldProps {
          type: 'radio';
          options: { label: string; value: string | number }[];
      }
      
    • 接着使用联合类型定义所有可能的表单字段类型:
    type FormFieldProps = TextInputFieldProps | SelectFieldProps | RadioFieldProps;
    
    • 最后定义Form组件的props类型,fields属性为表单字段配置数组:
    interface FormProps {
        fields: FormFieldProps[];
    }
    
  2. 编写Form组件的渲染逻辑
    • Form组件中,通过遍历fields数组来渲染不同类型的表单字段。
    import React from'react';
    
    const Form: React.FC<FormProps> = ({ fields }) => {
        return (
            <form>
                {fields.map(field => {
                    switch (field.type) {
                        case 'text':
                            return (
                                <div key={field.id}>
                                    <label htmlFor={field.id}>{field.label}</label>
                                    <input type={field.type} id={field.id} placeholder={field.placeholder} />
                                </div>
                            );
                        case'select':
                            return (
                                <div key={field.id}>
                                    <label htmlFor={field.id}>{field.label}</label>
                                    <select id={field.id}>
                                        {field.options.map(option => (
                                            <option key={option.value} value={option.value}>{option.label}</option>
                                        ))}
                                    </select>
                                </div>
                            );
                        case 'radio':
                            return (
                                <div key={field.id}>
                                    <label>{field.label}</label>
                                    {field.options.map(option => (
                                        <div key={option.value}>
                                            <input type="radio" id={`${field.id}-${option.value}`} value={option.value} />
                                            <label htmlFor={`${field.id}-${option.value}`}>{option.label}</label>
                                        </div>
                                    ))}
                                </div>
                            );
                        default:
                            return null;
                    }
                })}
            </form>
        );
    };
    
    export default Form;
    
    • 在上述渲染逻辑中,通过switch语句根据field.type的值来决定渲染哪种类型的表单字段,这样就能根据不同的表单字段配置,类型安全地渲染出相应的表单元素。