面试题答案
一键面试- 使用
Required
工具类型使所有属性变为必填:interface NestedObject { prop1: { subProp1?: string; subProp2?: number[]; }; prop2?: boolean; } type AllRequired = Required<{ prop1: Required<NestedObject['prop1']>; prop2: NestedObject['prop2'] }>;
- 在实际项目中可能遇到的问题及解决方案:
- 问题:
- 数据来源不完整:如果数据是从外部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 }; }
- 数据验证:在数据获取后,使用运行时验证库(如
- 问题: