Poznámka: toto bylo zjednodušeno a aktualizováno 4/13/2017, aby odrážela strojopisu 2.1, viz historii strojopisem 1,8 odpověď.
Vypadá to, že chcete, aby se parametr objekt být nepovinný, a také každý z vlastností v objektu, který má být nepovinný. V tomto příkladu, jak je uvedeno, není potřeba syntax přetížení. Chtěl bych poukázat na některé špatné praktiky se v některé z odpovědí zde. Je pravda, že to není nejmenší výrazem v podstatě psát box = { x: 0, y: 87, width: 4, height: 0 }, ale poskytuje všechny psaní kódu jemnosti byste mohli chtít od třídy, jak je popsáno. Tento příklad umožňuje volání funkce s jedním, některými, všemi, nebo žádný z parametrů a ještě získat výchozí hodnoty.
/** @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;
}
}
Jedná se o velmi bezpečný způsob, jak psát pro parametry, které nemusí mít všechny vlastnosti objektu definován. Nyní můžete bezpečně napsat některý 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});
Sestaven, vidíte, že volitelné parametry skutečně jsou volitelné, který se vyhýbá nástrahám široce používaný (ale náchylné k chybám) nouzový syntaxe var = isOptional || default;kontrolou proti void 0, což je zkratka pro undefined:
Sestavený výstup
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;
}());
Dodatek: Nastavení výchozích hodnot: špatně
||(Nebo) provozovatel
Zvážit nebezpečí ||/ nebo operátory při nastavování výchozích hodnot záložní, jak je uvedeno v některých jiných odpovědí. Tento kód níže ukazuje špatně nastavit výchozí hodnoty. Se můžete dostat k neočekávaným výsledkům při vyhodnocování proti Falsey hodnotami, jako je 0, ‚‘, null, nedefinované, falešný 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)
V mých testů, využívajících es6 / strojopisem odbourání objekt může být téměř 90% rychleji než Object.assign . Použití destrukturalizovaného parametr umožňuje pouze metody a vlastnosti, které jste přiřazen k objektu. Vezměme si například tuto metodu:
class BoxTest {
public x?: number = 1;
constructor(obj: BoxTest = {} as BoxTest) {
Object.assign(this, obj);
}
}
Pokud jiný uživatel nebyl použití strojopisu a pokoušel se umístit parametr, který nepatří, dejme tomu, že by se mohli pokusit uvedení znemovitosti
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')