Javascript 在Typescript中管理可选接口属性的最佳实践?
我有一个具有以下属性的接口:Javascript 在Typescript中管理可选接口属性的最佳实践?,javascript,node.js,typescript,Javascript,Node.js,Typescript,我有一个具有以下属性的接口: interface ISchedule { date: string; startTime: string; endTime?: string; } 现在这里的endTime属性是可选的,因为当使用接口创建对象时,它是未定义的。稍后将在代码库中定义它。定义之后,我必须将对象传递给一个函数,其中对象的类型是ISchedule 现在在函数内部,如果我尝试使用endTime属性,我会得到: “对象可能未定义” 现在有两种方法来处理这个问题: 添加一个if检查
interface ISchedule {
date: string;
startTime: string;
endTime?: string;
}
现在这里的endTime属性是可选的,因为当使用接口创建对象时,它是未定义的。稍后将在代码库中定义它。定义之后,我必须将对象传递给一个函数,其中对象的类型是ISchedule
现在在函数内部,如果我尝试使用endTime属性,我会得到:
“对象可能未定义”
现在有两种方法来处理这个问题:
期待解决方案 我同意你的同事的意见,你应该把
if
检查放在适当的位置。这样做的原因是您的代码将更加健壮。也许当前总是设置endTime
,但是稍后,如果两端的实现发生了变化,您仍然需要记住您所做的决定,如果是其他人在处理代码,那么很容易引入bug。未定义值的全部要点是,当您没有这些值时该怎么办?您可以简单地使用destructuring设置默认值
const {endTime = "00:00"} = getSchedule();
这样,endTime将始终是未定义的
或者……您也可以为整个对象设置默认值
const neverNull = {...getSchedule(), {endTime:"00:00"}}
现在就我个人而言,我尽量不直接写普通对象。在您的情况下,我很可能会将这些数据包装到适配器中,如下所示:
export abstract class AbstractAdapter<T> {
constructor(protected data: T) {
}
public getData(): T {
return this.data;
}
}
如果您确定属性是在特定函数中设置的,您可以为它创建一个不同的接口,其中endTime不是可选的。这是一个很好的建议!我没有想到。关于健壮性的好主意!考虑到这一点,额外的检查是有意义的。因此,我们的想法是在创建对象时添加默认值(通过适配器或直接写入),然后用实际值覆盖默认值?这样,接口将不包含可选属性。每个属性都是必需的。@Hussain是的,这是一种确保所有属性至少有一个值的方法。否则,您仍然可以在适配器中添加一个值,如hasEndTime(),如果定义了数据的属性,则返回true。这样您就有了一个干净的代码。如果定义了数据,添加一个属性返回true也是一个好主意。谢谢你的帮助!不久前我刚换成打字脚本,所以我正在学习什么是最佳实践。
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());