Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Typescript中管理可选接口属性的最佳实践?_Javascript_Node.js_Typescript - Fatal编程技术网

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检查
  • 使用!绕过空/未定义的检查
  • 我认为,在属性周围添加if检查是多余的/危险的,因为我确信该属性将始终存在/必须存在于相应的函数中。如果属性不存在,函数的行为将发生更改

    然而,一些队友不同意这一点,坚持使用if检查

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


    期待解决方案

    我同意你的同事的意见,你应该把
    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());