Merk: Dette ble forenklet og oppdatert 4/13/2017 å reflektere Loggfila 2.1, se historikk for Loggfila 1,8 svaret.
Det høres ut som du vil at objektet parameter å være valgfritt, og også hver av eiendommene i objektet skal være valgfritt. I eksemplet, som forutsatt, overbelastning syntaks er ikke nødvendig. Jeg ønsket å peke ut noen dårlige praksis i noen av svarene her. Gitt, det er ikke den minste mulige uttrykk for i hovedsak å skrive box = { x: 0, y: 87, width: 4, height: 0 }, men dette gir alle kode hinte niceties du kunne ønske fra klassen som beskrevet. Dette eksempelet kan du kalle en funksjon med en, noen, alle, eller ingen av parametrene og likevel få standardverdier.
/** @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;
}
}
Dette er en svært sikker måte å skrive for parametere som kanskje ikke har alle egenskapene til objektet definert. Du kan nå trygt skrive noen av disse:
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});
Kompilert, ser du at de valgfrie parametere virkelig er valgfrie, som unngår fallgrubene en mye brukt (men feilutsatte) reservesyntaksen var = isOptional || default;ved å sjekke mot void 0, som er forkortelse for undefined:
Den kompilerte 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;
}());
Tillegg: Innstilling standardverdier: feil vei
Den ||(eller) operatør
Vurdere faren for ||/ eller operatører når du setter standardreserveverdier som vist i noen andre svar. Denne koden nedenfor illustrerer feil måte å angi standardinnstillinger. Du kan få uventede resultater ved evaluering mot falsey verdier som 0, '', null, udefinert, falsk, 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 (dette, obj)
I mine tester, ved hjelp ES6 / Loggfila destrukturisert objekt kan være nesten 90% raskere enn Object.assign . Ved hjelp av en destrukturerte parameter bare tillater metoder og egenskaper du har tilordnet objektet. For eksempel vurdere denne metoden:
class BoxTest {
public x?: number = 1;
constructor(obj: BoxTest = {} as BoxTest) {
Object.assign(this, obj);
}
}
Hvis en annen bruker ikke brukte Loggfila og forsøkte å plassere en parameter som ikke hører hjemme, sier, kan de prøve å sette en zeiendom
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')