MST
星途 面试题库

面试题:TypeScript中Required在复杂类型中的应用

给定一个接口类型:interface NestedObject { prop1: { subProp1?: string; subProp2?: number[] }; prop2?: boolean; } 请编写代码,使用Required工具类型使得整个嵌套对象的所有属性都变为必填,并说明在实际项目中这样做可能会遇到的问题及解决方案。
39.1万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 使用Required工具类型使所有属性变为必填
    interface NestedObject {
        prop1: {
            subProp1?: string;
            subProp2?: number[];
        };
        prop2?: boolean;
    }
    
    type AllRequired = Required<{
        prop1: Required<NestedObject['prop1']>;
        prop2: NestedObject['prop2']
    }>;
    
  2. 在实际项目中可能遇到的问题及解决方案
    • 问题
      • 数据来源不完整:如果数据是从外部API获取,API返回的数据可能不包含所有必填字段,直接使用必填类型会导致类型错误。例如,API可能由于网络问题、服务器端配置错误等原因没有返回所有预期字段。
      • 兼容性问题:与旧代码或第三方库集成时,旧代码或第三方库可能生成的对象不符合新的必填类型要求。比如一些遗留模块按照旧的非必填规则生成数据。
    • 解决方案
      • 数据验证:在数据获取后,使用运行时验证库(如joi等)对数据进行验证。例如:
        const Joi = require('joi');
        
        const schema = Joi.object({
            prop1: Joi.object({
                subProp1: Joi.string().required(),
                subProp2: Joi.array().items(Joi.number()).required()
            }).required(),
            prop2: Joi.boolean().required()
        });
        
        const data = { prop1: { subProp1: 'test', subProp2: [1, 2] }, prop2: true };
        const { error } = schema.validate(data);
        if (error) {
            console.error('Data validation error:', error.details);
        }
        
      • 类型转换与默认值设置:在使用数据前,对不完整的数据进行类型转换并设置默认值。例如:
        function fillDefaultValues(data: Partial<AllRequired>): AllRequired {
            const defaultProp1: Required<NestedObject['prop1']> = {
                subProp1: '',
                subProp2: []
            };
            const defaultProp2 = false;
        
            return {
                prop1: data.prop1? {
                    subProp1: data.prop1.subProp1?? defaultProp1.subProp1,
                    subProp2: data.prop1.subProp2?? defaultProp1.subProp2
                } : defaultProp1,
                prop2: data.prop2?? defaultProp2
            };
        }