Megjegyzés: ez az egyszerűsített és frissített 2017/04/13 tükrözik géppel 2.1, lásd előzmények géppel 1,8 választ.
Úgy hangzik, mintha az objektum paraméter opcionális, továbbá az egyes tulajdonságait a tárgy kötelező. A példában előírt, túlterhelés szintaxis nincs szükség. Azt akartam rámutatni néhány rossz gyakorlat a néhány választ itt. Nyújtott, ez nem a lehető legkisebb kifejezése alapvetően írásban box = { x: 0, y: 87, width: 4, height: 0 }, de ez biztosítja az összes kódot hint apróságokra, amit esetleg szeretne az osztály leírtak. Ez a példa lehetővé teszi, hogy hívja a funkciót egy, több, az összes, vagy sem a paraméterek, és még mindig az alapértelmezett értékeket.
/** @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;
}
}
Ez egy nagyon biztonságos módja, hogy írjon paraméterek nem lehet az összes objektum tulajdonságait meghatározni. Most már biztonságosan levelet ezek bármelyikét:
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});
Összeállította, akkor láthatjuk, hogy a választható paraméterek valóban nem kötelező, hogy elkerüli a buktatókat egy széles körben használt (de hibalehetőséget) üzemszüneti szintaxis var = isOptional || default;ellenőrzésével szemben void 0, amely a rövidítés undefined:
Az összeállított kimenet
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;
}());
Kiegészítés: Beállítás alapértelmezett értékek: a rossz irányba
A ||(vagy) operátor
Tekintsük a veszélye ||/ vagy a gazdasági szereplők, amikor beállítja az alapértelmezett értékek visszaesett, ahogy néhány más válaszokat. Ez a kód szemlélteti a rossz út alapbeállításokat. Akkor nem várt eredmények értékelésekor ellen falsey értékek, mint 0, „”, null, meghatározatlan, hamis, 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 (e, obj)
Az én tesztek segítségével ES6 / géppel elbontott objektum lehet majdnem 90% -kal gyorsabb, mint a Object.assign . Egy bomlasztott paraméter csak lehetővé teszi a módszerek és tulajdonságok, amit rendelt az objektumot. Vegyük például ezt a módszert:
class BoxTest {
public x?: number = 1;
constructor(obj: BoxTest = {} as BoxTest) {
Object.assign(this, obj);
}
}
Ha egy másik felhasználó nem az írógéppel és megpróbáltuk a paraméter, amely nem tartozik, mondjuk, lehet, hogy megpróbálják amivel egy ztulajdonság
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')