Typescript, установить значения по умолчанию для необязательных параметров в классе - PullRequest
1 голос
/ 11 февраля 2020

У меня есть этот класс

export class dialogConfig {
    title: String;
    message?: String;
    okText?: String;
    withDecline?: false;
    width?: Number;
    height?: Number;
}

, и у меня есть эта функция

  openDialog(config:dialogConfig){
        ...
    });

Я хочу вызвать такую ​​функцию

  openDialog({
    title: 'viola'
  }

Остальные параметры, которые не указаны, я хочу установить значения по умолчанию. Как мне этого добиться.

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Что, вероятно, должно измениться в этом вопросе:

  • dialogConfig должно быть DialogConfig, так как в TypeScript для именованных типов объектов принято начинать с заглавной буквы. Начально-строчные идентификаторы обычно обозначают имена переменных или, возможно, примитивные типы.

  • Я подозреваю, что вы должны использовать interface вместо class. Значение {title: "viola"} на самом деле не является экземпляром любого такого класса во время выполнения. Вы можете использовать class в качестве и interface, поэтому openDialog({title: "viola"}) не является ошибкой, но более просто использовать interface напрямую. Если вы не пишете new DialogConfig() или instanceof DialogConfig, вам не нужно class. И если вы пишете эти вещи, вы должны быть очень осторожны с литералами, не являющимися экземплярами, такими как {title: "viola"}.

  • Number должно быть number и String должно быть string. Почти всегда ошибочно использовать прописные версии примитивных типов данных .

  • false, вероятно, должно быть boolean, если только вы не говорите, что withDecline, если указано, всегда должно быть false. Это возможно, но я запутался в том, как это будет работать с намеченным вариантом использования указания значений по умолчанию, когда они опущены. Если вы хотите, чтобы withDecline было true, тогда вы хотите boolean.

Это дает нам следующее:

interface DialogConfig {
    title: string;
    message?: string;
    okText?: string;
    withDecline?: boolean;
    width?: number;
    height?: number;
}

Это как я уже сказал, вот как я бы назначил значения по умолчанию:

const defaultValues = {
    message: "",
    okText: "",
    withDecline: false,
    width: 0,
    height: 0
}

function openDialog(config: DialogConfig) {
    const filledInConfig: Required<DialogConfig> = { ...defaultValues, ...config };    
    console.log(JSON.stringify(filledInConfig));
};

Здесь я использую объект с именем defaultValues, и использую распространение объекта для создания нового значения со всеми свойства defaultValues, которые затем перезаписываются всеми свойствами config. Предполагая, что config не имеет явно включенных undefined свойств, это приведет к значению filledInConfig типа Required<DialogConfig>, так же, как DialogConfig, но со всеми необходимыми свойствами вместо того, чтобы иметь некоторые из них необязательны .

Если вы не хотите использовать распространение объекта, есть также Object.assign():

const filledInConfig: Required<DialogConfig> = Object.assign({}, defaultValues, config);

В любом случае вы получите желаемый результат:

openDialog({
    title: 'viola'
}); 
// {"message":"","okText":"","withDecline":false,"width":0,"height":0,"title":"viola"}

Хорошо, надеюсь, это поможет; удачи!

Детская площадка ссылка на код

0 голосов
/ 11 февраля 2020

Чем меньше ручного назначения объектов вы можете сделать, тем лучше (на мой взгляд). Позвольте встроенным функциям языка справиться с этим для вас.

Вы можете использовать эту сигнатуру функции для openDialog, чтобы достичь того, что вы ищете:


// note that I have changed this to `interface` here
interface dialogConfig {
    title: String;
    message?: String;
    okText?: String;
    withDecline?: false;
    width?: Number;
    height?: Number;
}

// set your default values for any parameters here, like you see with
// message = 'default'
function openDialog ({ title, message = 'default' }: dialogConfig) {
  console.log(title);
  console.log(message);
}

openDialog({ title: 'Foobar' });
// will output:
// > Foobar
// > default
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...