首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript类构造函数中的可选参数

TypeScript类构造函数中的可选参数
EN

Stack Overflow用户
提问于 2020-04-19 07:01:10
回答 1查看 1.6K关注 0票数 2

有没有一种方法可以减轻TypeScript中可选参数的顺序?我现在有这门课

代码语言:javascript
复制
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;
    }
}

对于这个区域类,我需要namestring参数,但不需要itemhazard参数。我尝试通过以下方式实例化一个Area对象:

代码语言:javascript
复制
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。是否有减轻或放弃这种行为,我们可以传递与任何可选参数匹配的第三个参数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-19 07:08:24

由类型记录完成的类型检查只存在于类型记录中,在编译的Javascript中不存在,因此如果允许的话,Javascript将无法确定您实际上试图传递哪个参数。

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

代码语言:javascript
复制
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 });
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61300707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档