Nota: questo è stato semplificato e aggiornato per riflettere 2017/04/13 dattiloscritto 2.1, vedere la storia per dattiloscritto 1.8 risposta.
Sembra che si desidera che il parametro oggetto deve essere facoltativa, e anche ciascuna delle proprietà nell'oggetto di essere facoltativa. Nell'esempio, come previsto, non è richiesta la sintassi sovraccarico. Ho voluto sottolineare alcune pratiche negative in alcune delle risposte qui. Certo, non è la più piccola espressione possibile della sostanza scrivere box = { x: 0, y: 87, width: 4, height: 0 }, ma questo fornisce tutte le sottigliezze che alludono codice che si può desiderare dalla classe come descritto. Questo esempio consente di chiamare una funzione con uno, alcuni, tutti, o nessuno dei parametri e ancora ottenere i valori di default.
/** @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;
}
}
Questo è un modo molto sicuro per scrivere i parametri che non possono avere tutte le proprietà dell'oggetto definito. A questo punto è possibile scrivere in modo sicuro uno di questi:
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});
Compilato, si vede che i parametri facoltativi veramente sono opzionali, che evita le insidie di un ampiamente utilizzato (ma incline errore) di sintassi fallback di var = isOptional || default;controllando contro void 0, che è una scorciatoia per undefined:
L'output compilato
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: Impostazione valori di default: il modo sbagliato
L' ||operatore (o)
Prendere in considerazione il pericolo di ||/ o operatori quando si impostano valori di ripristino di default come mostrato in alcune altre risposte. Questo codice illustra il modo sbagliato di impostare i valori predefiniti. È possibile ottenere risultati imprevisti quando si valuta contro Falsey valori come 0, '', null, undefined, falso, 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 (questo, obj)
Nel mio test, utilizzando ES6 dattiloscritto destrutturato oggetto / può essere quasi il 90% più veloce di Object.assign . Utilizzando un parametro destrutturato consente solo i metodi e le proprietà che avete assegnato all'oggetto. Ad esempio, si consideri questo metodo:
class BoxTest {
public x?: number = 1;
constructor(obj: BoxTest = {} as BoxTest) {
Object.assign(this, obj);
}
}
Se un altro utente non stava usando dattiloscritto e ha tentato di inserire un parametro che non gli apparteneva, per esempio, si potrebbe provare a mettere un zimmobile
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')