Notă: acest lucru a fost simplificată și actualizată pentru a reflecta 4/13/2017 typescript 2.1, vezi istoricul pentru 1.8 typescript răspuns.
Se pare că doriți ca parametrul obiect să fie opțional și , de asemenea , fiecare dintre proprietățile în obiectul să fie opțională. În exemplu, astfel cum este prevăzut, nu este necesară sintaxa de suprasarcină. Am vrut să subliniez unele practici rele în unele dintre răspunsurile aici. Desigur, nu este cea mai mică expresie posibilă a scris în esență box = { x: 0, y: 87, width: 4, height: 0 }, dar acest lucru oferă toate cod subtilitățile sugerand faptul ca ai putea dori , eventual , din clasa așa cum este descris. Acest exemplu vă permite să apelați o funcție cu una, unele, toate, sau nici unul dintre parametrii și a obține în continuare valori implicite.
/** @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;
}
}
Acesta este un mod foarte sigur de a scrie pentru parametrii care nu pot avea toate proprietățile obiectului definit. Acum puteți să scrie în siguranță oricare dintre acestea:
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});
Compilat, vezi că parametrii opționali cu adevărat sunt opționale, care să evite capcanele unei utilizate pe scară largă (dar predispuse la erori) sintaxa de rezervă var = isOptional || default;prin verificarea împotriva void 0, care este prescurtare pentru undefined:
Ieșirea Compilat
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;
}());
Addendum: stabilirea unor valori implicite: mod greșit
||(Sau) operatorul
Luați în considerare pericolul ||/ sau operatori în stabilirea valorilor implicite alternative așa cum se arată în alte răspunsuri. Acest cod de mai jos ilustrează modul greșit de a seta valorile implicite. Puteți obține rezultate neașteptate atunci când se evaluează împotriva Falsey valori , cum ar fi 0, „“, nul, nedefinit, fals, 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 (aceasta, obj)
În testele mele, folosind dactilografiat destructurat obiect ES6 / poate fi aproape 90% mai repede decât Object.assign . Folosind un parametru destructurat permite doar metode și proprietăți care le - ați atribuit obiectului. De exemplu, ia în considerare această metodă:
class BoxTest {
public x?: number = 1;
constructor(obj: BoxTest = {} as BoxTest) {
Object.assign(this, obj);
}
}
Dacă un alt utilizator nu a fost folosind typescript și a încercat să plaseze un parametru care nu fac parte, să zicem, s - ar putea încerca punerea o zproprietate
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')