繁体   English   中英

Class 中的可选参数 TypeScript 中的构造函数

[英]Optional Parameters in Class Constructors in TypeScript

有没有办法减轻 TypeScript 中可选参数的顺序? 我目前有 class

export default class Area {
    private name: string;
    private description: string;
    private item?: Item;
    private hazard?: Hazard;

    constructor(name: string, description: string, item?: Item, hazard?: Hazard) {
        this.name = name;
        this.description = description;
        this.item = item;
        this.hazard = hazard;
    }
}

对于此区域 class,我需要namestring参数,但不需要itemhazard参数。 我尝试通过以下方式实例化区域 object:

let item = new Item(); // had required parameters, but not important for now
let hazard = new Hazard(); // had required parameters, but not important for now

let area = new Area("test", "test"); // works as expected
let area1 = new Area("test", "test", item); // works as expected
let area2 = new Area("test", "test", hazard); // DOES NOT WORK as expected
let area3 = new Area("test", "test", item, hazard); // works as expected

即使hazarditem是可选的,如果我想省略item ,我需要为第三个参数传入undefined 有没有办法减轻或放弃这种行为,我们可以传入与任何可选参数匹配的第三个参数?

Typescript 所做的类型检查仅存在于 Typescript 中 - 它不存在于已编译的 Javascript 中,因此如果允许,Z9E13B69D1D2DA927102 将无法确定实际尝试传递哪个参数。

相反,传递一个可选的object可能具有itemhazard属性:

class Item{}
class Hazard{}

export default class Area {
    private name: string;
    private description: string;
    private item?: Item;
    private hazard?: Hazard;

    constructor(
      name: string,
      description: string,
      obj: { item?: Item, hazard?: Hazard } = {}
    ) {
        this.name = name;
        this.description = description;
        if (obj.item) this.item = obj.item;
        if (obj.hazard) this.hazard = obj.hazard;
    }
}

const item = new Item();
const hazard = new Hazard();

const area = new Area("test", "test"); 
const area1 = new Area("test", "test", { item });
const area2 = new Area("test", "test", { hazard });
const area3 = new Area("test", "test", { item, hazard });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM