Примечание: это было упрощено и обновлено 4/13/2017, чтобы отразить машинопись 2.1 см истории для машинописи 1.8 ответа.
Это звучит , как вы хотите, чтобы параметр объекта будет необязательным, а также каждого из свойств в объекте будет необязательным. В примере, как это предусмотрено, синтаксис перегрузки не требуется. Я хотел бы отметить некоторые плохие практики в некоторых из ответов здесь. Конечно, это не самое маленькое выражение по существу писать box = { x: 0, y: 87, width: 4, height: 0 }, но это дает все подсказки коды тонкости вы могли возможно хотеть от класса , как описано. Этот пример позволяет вызвать функцию с одним, некоторые, все, или ни один из параметров , и все еще получить значения по умолчанию.
/** @class */
class Box {
public x?: number;
public y?: number;
public height?: number;
public width?: number;
// The class can work double-duty as the interface here since they are identical
// Alternately, reference your own interface, e.g.: `...BoxI = {} as BoxI`
constructor(obj: Box = {} as Box) {
// Define the properties of the incoming `obj` object here.
// Setting a default value with the `= 0` syntax is optional for each parameter
let {
x = 0,
y = 0,
height = 0,
width = 0
} = obj;
/** Use jsdoc comments here for inline ide auto-documentation */
this.x = x;
this.y = y;
this.height = height;
this.width = width;
}
}
Это очень безопасный способ записи параметров, которые не могут иметь все свойства объекта, определенного. Теперь вы можете смело писать любого из них:
const box1 = new Box();
const box2 = new Box({});
const box3 = new Box({x:0});
const box4 = new Box({x:0, height:10});
const box5 = new Box({x:0, y:87,width:4,height:0});
// Correctly reports error in TypeScript, and in js, box6.z is undefined
const box6 = new Box({z:0});
Составитель, вы видите , что дополнительные параметры действительно являются необязательными, что позволяет избежать ловушек широко используется (но к ошибкам) запасной вариант синтаксиса var = isOptional || default;, проверяя против void 0, который является сокращением для undefined:
Составитель Выходной
var Box = (function () {
function Box(obj) {
if (obj === void 0) { obj = {}; }
var _a = obj.x,
x = _a === void 0 ? 1 : _a,
_b = obj.y,
y = _b === void 0 ? 1 : _b,
_c = obj.height,
height = _c === void 0 ? 1 : _c,
_d = obj.width,
width = _d === void 0 ? 1 : _d;
this.x = x;
this.y = y;
this.height = height;
this.width = width;
}
return Box;
}());
Приложение: Установка значений по умолчанию: неправильный путь
||(Или) оператора
Рассмотрим опасность ||/ или операторов при установке по умолчанию значения замещающего , как показано в некоторых других ответах. Этот код ниже иллюстрирует неправильный способ установки по умолчанию. Вы можете получить неожиданные результаты при оценке против falsey значений , как 0, «», NULL, неопределенный, ложный, NaN:
var myDesiredValue = 0;
var result = myDesiredValue || 2;
// This test will correctly report a problem with this setup.
console.assert(myDesiredValue === result && result === 0, 'Result should equal myDesiredValue. ' + myDesiredValue + ' does not equal ' + result);
Object.assign (это, OBJ)
В моих тестах, используя ES6 / машинопись деструктурированного объекта может быть почти 90% быстрее , чем Object.assign . Использование деструктурированного параметр позволяет только методы и свойства вы присвоенное объекту. Например, рассмотрим этот метод:
class BoxTest {
public x?: number = 1;
constructor(obj: BoxTest = {} as BoxTest) {
Object.assign(this, obj);
}
}
Если другой пользователь не использует машинопись и попытался поместить параметр , который не принадлежит, скажем, они могли бы попытаться положить zнедвижимость
var box = new BoxTest({x: 0, y: 87, width: 4, height: 0, z: 7});
// This test will correctly report an error with this setup. `z` was defined even though `z` is not an allowed property of obj.
console.assert(typeof box.z === 'undefined')