在Typescript中管理可选接口属性的最佳实践?

时间:2018-08-17 07:23:19

标签: javascript node.js typescript

我有一个具有以下属性的界面:

interface ISchedule {
  date: string;
  startTime: string;
  endTime?: string;
}
现在

此处的 endTime 属性是可选的,因为在使用该接口创建对象时未定义该属性。稍后在代码库中定义。定义好之后,我必须将对象传递给对象类型为ISchedule的函数。

现在在函数内部,如果我尝试使用 endTime 属性,则会得到:

  

“对象可能未定义”

现在有两种方法可以解决此问题:

  1. 添加if支票
  2. 使用!绕过空/未定义的检查

我认为,在属性周围添加if检查是多余/危险的,因为我确信该属性将始终存在/必须存在于各个函数中。如果该属性不存在,则该函数的行为将发生变化。

但是,一些队友对此表示不同,并坚持使用if支票。

我想知道在Typescript中处理可选属性的最佳实践是什么,以及在代码库中很多地方发生这种情况的理想方式是什么?

期待解决方案!

2 个答案:

答案 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());