打字稿:如何根据同一界面中的布尔值排除选项?

时间:2018-04-05 14:12:16

标签: javascript angular typescript

我有一个界面,我正在尝试实现这个:

export interface Passenger {
       id: number,
       name: string,
       checkedIn: boolean,
       checkedInDate?: Date // <- How to make this optional only if checkedIn = false
}

4 个答案:

答案 0 :(得分:0)

为什么当checkedInDate为真时你不要忽略变量checkedIn的值,就像这样

if(!pessageobj.checkedIn) {
 pessageobj.checkedInDate = new Date();
} else {
pessageobj.checkedInDate =  some default date like min date;
}

答案 1 :(得分:0)

您无法在界面中声明此信息。但是,您可以在类中实现此行为:

export class Passenger {
   id: number;
   name: string;
   checkedInDate?: Date;

   get checkedIn() {
      return this.checkedInDate != null;
  }       
 }

答案 2 :(得分:0)

您可以定义Union Type

export type Passenger = {
    id: number,
    name: string,
    checkedIn: true,
    checkedInDate: Date
} | {
    id: number,
    name: string,
    checkedIn: false
    checkedInDate?: Date // you can just this field
}

答案 3 :(得分:0)

模板参数可以更具体地指定checkedIn的类型(不仅仅是boolean)。然后,路口可以“添加” checkedInDate的可选版本或必需版本。

export type Passenger<A extends boolean> = {
    id: number;
    name: string;
    checkedIn: A;
} & (A extends false
    ? {
        checkedInDate?: Date;
    }
    : {
        checkedInDate: Date;
    });