Что, вероятно, должно измениться в этом вопросе:
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"}
Хорошо, надеюсь, это поможет; удачи!
Детская площадка ссылка на код