Uwaga: ta została uproszczona i aktualizowane w celu odzwierciedlenia 4/13/2017 maszynopis 2.1, zobaczyć historię maszynopis 1,8 odpowiedź.
Brzmi to jak chcesz parametr obiekt będzie opcjonalne, a także każdy z właściwości obiektu, aby być opcjonalne. Na przykład, jak przewidziano, składnia przeciążenie nie jest potrzebne. Chciałem zwrócić uwagę na pewne złe praktyki w niektórych odpowiedzi tutaj. To prawda, nie jest to najmniejsza możliwa ekspresja zasadniczo pisanie box = { x: 0, y: 87, width: 4, height: 0 }, ale zapewnia to cały kod sugerując subtelności, czego można chcieć od klasy, jak to opisano. Przykład ten pozwala wywołać funkcję z jednym, niektóre, wszystkie lub żaden z parametrów i nadal uzyskać wartości domyślne.
/** @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;
}
}
Jest to bardzo bezpieczny sposób pisać o parametrach, które nie mogą mieć wszystkie właściwości obiektu zdefiniowane. Teraz można bezpiecznie pisać każdy z nich:
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});
Skompilowany, widać, że naprawdę opcjonalne parametry są opcjonalne, że unika pułapek powszechnie stosowane (ale podatne na błędy) awaryjna składnia var = isOptional || default;sprawdzając przed void 0, co jest skrótem dla undefined:
Wyjście skompilowanego
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;
}());
Uzupełnienie: Ustawianie wartości domyślnych: w niewłaściwy sposób
||Operatora (OR)
Rozważyć ryzyko ||/ lub operatorzy podczas ustawiania domyślnych wartości zastępczych, jak pokazano w niektórych innych odpowiedzi. Ten kod poniżej przedstawia w niewłaściwy sposób, aby ustawić domyślne. Można uzyskać niespodziewane wyniki przy ocenie przed falsey wartościach takich jak 0, „”, null, niezdefiniowanej, fałszywych, 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 (to obj)
W moich testach, z wykorzystaniem ES6 / maszynopis destrukturyzowaną obiekt może być prawie 90% szybciej niż Object.assign . Korzystanie z destrukturyzowaną parametr pozwala jedynie metody i właściwości już przypisane do obiektu. Na przykład, należy rozważyć tę metodę:
class BoxTest {
public x?: number = 1;
constructor(obj: BoxTest = {} as BoxTest) {
Object.assign(this, obj);
}
}
Jeśli inny użytkownik nie używał maszynopis i próbował umieścić parametr, który nie należał, powiedzmy, mogą spróbować oddanie zmienia
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')