TypeScript中如何安全使用属性类型关联的Interviewee对象?
如何安全使用关联类型的Interviewee对象
你当前的Interviewee接口定义中,stageable_type和stageable是两个独立的联合类型,TypeScript无法识别它们之间的对应关系,导致判断stageable_type后,无法自动推断stageable的具体类型,进而无法安全访问专属属性(比如StageableHire的time)。
最优解决方案:重构为判别式联合类型
将Interviewee定义为判别式联合类型,让TypeScript通过stageable_type这个唯一标识自动推断stageable的具体类型,这是TypeScript处理关联类型的原生推荐方案。
// 保留你已定义的各个Stageable类型 interface Stageable { /* 基础属性 */ } interface StageableFail { /* Failed阶段专属属性 */ } interface StageableInterview { /* 面试相关阶段专属属性 */ } interface StageableHire { time?: string; /* 入职阶段专属属性 */ } // 复用原有的StageableType定义 type StageableType = 'InterviewProposal' | 'Interview' | 'HireProposal' | 'Hire' | 'Failed'; // 重构Interviewee为对应关系明确的联合类型 type Interviewee = | { stageable_type: 'InterviewProposal'; stageable: StageableInterview } | { stageable_type: 'Interview'; stageable: Stageable } | { stageable_type: 'HireProposal'; stageable: Stageable } | { stageable_type: 'Hire'; stageable: StageableHire } | { stageable_type: 'Failed'; stageable: StageableFail };
安全使用示例
重构后,TypeScript会自动根据stageable_type收窄stageable的类型,无需额外断言即可安全访问专属属性:
function handleInterviewee(interviewee: Interviewee) { if (interviewee.stageable_type === 'Hire') { // 此时TypeScript自动推断stageable为StageableHire类型 if (interviewee.stageable.time) { console.log(`计划入职时间:${interviewee.stageable.time}`); } } if (interviewee.stageable_type === 'Failed') { // 自动推断stageable为StageableFail类型,可安全访问其专属属性 } }
无法重构原类型时的替代方案:自定义类型守卫
如果Interviewee接口来自第三方库或无法修改,可通过自定义类型守卫手动关联两个属性的对应关系:
// 自定义类型守卫,判断是否为Hire阶段的候选人 function isHireInterviewee(interviewee: Interviewee): interviewee is { stageable_type: 'Hire'; stageable: StageableHire } { return interviewee.stageable_type === 'Hire'; } // 使用类型守卫 function handleInterviewee(interviewee: Interviewee) { if (isHireInterviewee(interviewee)) { if (interviewee.stageable.time) { console.log(`计划入职时间:${interviewee.stageable.time}`); } } }
内容的提问来源于stack exchange,提问作者alex87
相关产品推荐
相关产品推荐

