官术网_书友最值得收藏!

Optional properties and parameters

We might want to make a property optional because not every situation where the interface is implemented requires it. Let's take the following steps in our OrderDetail interface:

  1. Let's create an optional property for the date it was added. We specify an optional value by putting a ? at the end of the property name but before the type annotation:
interface OrderDetail {
product: Product;
quantity: number;
dateAdded?: Date,
getTotal(discount: number): number;
}

We'll see that our implementation of this interface, tableOrder, isn't broken. We can choose to add dateAdded to tableOrder but it isn't required.

  1. We might also want to make a method parameter optional. We do this in a similar way by putting a ? after the parameter name. In our example, let's make discount optional in the OrderDetail interface:
interface OrderDetail {
product: Product;
quantity: number;
dateAdded?: Date,
getTotal(discount?: number): number;
}
  1. We can change the method implementation signature as well:
getTotal(discount?: number): number {
const priceWithoutDiscount = this.product.unitPrice * this.quantity;
const discountAmount = priceWithoutDiscount * (discount || 0);
return priceWithoutDiscount - discountAmount;
}

We've also dealt with the case when a discount isn't passed into the method by using (discount || 0) in the discountAmount variable assignment.

x || y is shorthand for if x is truthy then use x, otherwise, use y. The following values are falsy values: false, 0, "", null, undefined, and NaN. All other values are truthy.
  1. With our optional parameter in place, we can call getTotal without passing a value for the discount parameter:
tableOrder.getTotal()

The preceding line doesn't upset the TypeScript compiler.

主站蜘蛛池模板: 文水县| 依兰县| 建水县| 义马市| 磐石市| 普宁市| 维西| 平和县| 育儿| 海淀区| 双城市| 嘉荫县| 宜昌市| 北海市| 米易县| 水城县| 当雄县| 五华县| 安阳县| 山阴县| 沙湾县| 尼玛县| 平乐县| 峨眉山市| 芦山县| 福泉市| 井冈山市| 宁晋县| 株洲市| 泰来县| 台东县| 太仆寺旗| 桐城市| 苗栗市| 县级市| 南阳市| 宁河县| 凤城市| 澎湖县| 大连市| 巫山县|