我有一个具有以下属性的界面:
interface ISchedule {
date: string;
startTime: string;
endTime?: string;
}
现在此处的 endTime 属性是可选的,因为在使用该接口创建对象时未定义该属性。稍后在代码库中定义。定义好之后,我必须将对象传递给对象类型为ISchedule的函数。
现在在函数内部,如果我尝试使用 endTime 属性,则会得到:
“对象可能未定义”
现在有两种方法可以解决此问题:
我认为,在属性周围添加if检查是多余/危险的,因为我确信该属性将始终存在/必须存在于各个函数中。如果该属性不存在,则该函数的行为将发生变化。
但是,一些队友对此表示不同,并坚持使用if支票。
我想知道在Typescript中处理可选属性的最佳实践是什么,以及在代码库中很多地方发生这种情况的理想方式是什么?
期待解决方案!
答案 0 :(得分:0)
我同意您的同事的意见,您应该将if
支票放到位。这样做的原因是您的代码将更加健壮。也许endTime
当前始终处于设置状态,但是稍后,如果实现在任一端进行了更改,您仍然必须牢记所做出的决定,并且如果有人在执行代码,则可以很容易地做到这一点。引入错误。
答案 1 :(得分:0)
未定义值的全部要点是,当没有它们时该怎么办?您只需使用解构即可设置默认值
const {endTime = "00:00"} = getSchedule();
这样,endTime将始终是未定义的
或者...,您还可以为整个对象设置默认值
const neverNull = {...getSchedule(), {endTime:"00:00"}}
现在我个人不尝试直接写普通对象。在您的情况下,我很可能将这些数据包装到Adapter中,如下所示:
export abstract class AbstractAdapter<T> {
constructor(protected data: T) {
}
public getData(): T {
return this.data;
}
}
然后:
class ScheduleAdapter extends AbstractAdapter<ISchedule>{
public getEndTime(): string {
return this.getData().endTime || this.defaultEndTime();
}
private defaultEndTime():string {
return "00:00";
}
}
用法
const schedule = new ScheduleAdapter(getSchedule());
console.log(schedule.getEndTime());