Необязательные параметры в конструкторах классов в TypeScript - PullRequest
1 голос
/ 19 апреля 2020

Есть ли способ уменьшить порядок необязательных параметров в TypeScript? В настоящее время у меня есть класс

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;
    }
}

. Для этого класса области мне потребовались параметры name и string, но не параметры item или hazard. Я попытался создать экземпляр объекта Area следующими способами:

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

Несмотря на то, что hazard и item являются необязательными, если я хочу опустить item, мне нужно передать undefined для третий параметр. Есть ли способ смягчить или предсказать go это поведение, когда мы можем передать третий аргумент, который соответствует любому из необязательных параметров?

1 Ответ

1 голос
/ 19 апреля 2020

Проверка типов, выполняемая Typescript, существует только в Typescript - она ​​не существует в скомпилированном Javascript, поэтому, если бы это было разрешено, для Javascript не было бы никакого способа чтобы определить, какой аргумент вы на самом деле пытаетесь передать.

Вместо этого передайте необязательный объект , который может иметь свойства item или hazard:

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 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...