Let op: deze werd vereenvoudigd en gemoderniseerd 2017/04/13 om typoscript 2.1 weer te geven, zie de geschiedenis voor Typescript 1,8 antwoord.
Het klinkt als u wilt dat de parameter object optioneel zijn, en ook elk van de woningen in het object optioneel zijn. In het voorbeeld, zoals voorzien, overbelasting syntax is niet noodzakelijk. Ik wilde wijzen op een aantal slechte praktijken in het deel van de antwoorden. Toegegeven, het is niet de kleinst mogelijke uitdrukking van wezen schrijven box = { x: 0, y: 87, width: 4, height: 0 }, maar dit biedt alle codehints finesses u eventueel wilt uit de klasse zoals beschreven. In dit voorbeeld kunt u een functie aan te roepen met één enkele, alle, of geen van de parameters en nog steeds standaardwaarden.
/** @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;
}
}
Dit is een zeer veilige manier om te schrijven voor parameters die niet alle eigenschappen van het object bepaald kan hebben. U kunt nu veilig schrijven een van deze:
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});
Samengesteld, zie je dat de optionele parameters werkelijk zijn optioneel, dat de valkuilen van een veelgebruikt vermijdt (maar foutgevoelige) fallback syntaxis van var = isOptional || default;door te controleren tegen void 0, dat is een afkorting voor undefined:
De gecompileerde Output
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: Instelling standaardwaarden: de verkeerde manier
De ||(OR)
Denk aan het gevaar van ||/ of operators bij het instellen van standaard fallback waarden zoals in sommige andere antwoorden. Onder deze code illustreert de verkeerde manier om de standaardinstellingen in te stellen. U kunt onverwachte resultaten krijgen bij het evalueren tegen falsey waarden als 0, '', null, undefined, vals, 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 (deze, obj)
In mijn tests, met behulp van ES6 / typoscript gedestructureerd object kan bijna 90% sneller dan Object.assign zijn . Met behulp van een gedestructureerd parameter kan alleen methoden en eigenschappen die u aan het object hebt toegewezen. Denk bijvoorbeeld aan deze methode:
class BoxTest {
public x?: number = 1;
constructor(obj: BoxTest = {} as BoxTest) {
Object.assign(this, obj);
}
}
Als een andere gebruiker niet werd gebruikt Typescript en geprobeerd om een parameter die niet behoren, plaatsen we zeggen, zouden ze proberen zetten een zwoning
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')