Hinweis: Diese wurde vereinfacht und 2017.04.13 aktualisiert, um Typoskript 2.1, siehe Geschichte für Typoskript 1.8 Antwort.
Es klingt wie Sie die Objektparameter werden optional möchten, und auch jedes der Objekte im Objekt optional sein. In dem Beispiel, wie es vorgesehen ist , Überlast - Syntax ist nicht erforderlich. Ich wollte hier einige schlechte Praktiken in der einige der Antworten hinweisen. Zugegeben, es ist nicht der kleinste mögliche Ausdruck im Wesentlichen zu schreiben box = { x: 0, y: 87, width: 4, height: 0 }, aber dies stellt alle Codes Hinting Nettigkeiten Sie möglicherweise aus der Klasse , wie beschrieben nur wünschen können. In diesem Beispiel können Sie eine Funktion mit einem nennen, einige, alle oder keine der Parameter und noch Standardwerte erhalten.
/** @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;
}
}
Dies ist eine sehr sichere Art und Weise für die Parameter zu schreiben, die nicht alle Eigenschaften des Objekts definiert haben. Sie können nun sicher eine dieser schreiben:
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});
Zusammengestellt, sehen Sie , dass die optionalen Parameter wirklich optional sind, dass die Gefahren eines weit verbreiteten vermeidet (aber fehleranfällig) Ausweich Syntax var = isOptional || default;durch Überprüfung vor void 0, die Abkürzung für ist undefined:
Die kompilierte Ausgabe
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;
}());
Nachtrag: Festlegen der Standardwerte: der falsche Weg
Der ||(oder) -Operator
Betrachten wir die Gefahr ||/ oder Betreiber als Standardfehlerwerte Einstellung wie in einigen anderen Antworten gezeigt. Dieser Code unten zeigt die falsche Art und Weise Standardwerte einzustellen. Sie können unerwartete Ergebnisse erhalten , wenn sie gegen die Bewertung Falsey Werte wie 0, ‚‘, null, nicht definiert, falsch, 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 (this, obj)
In meinen Tests es6 / Typoskript destructured Objekt mit fast 90% schneller als Object.assign sein . Nur einen destrukturierten Parameter verwenden , können Methoden und Eigenschaften , die Sie für das Objekt zugewiesen haben. Betrachten wir zum Beispiel diese Methode:
class BoxTest {
public x?: number = 1;
constructor(obj: BoxTest = {} as BoxTest) {
Object.assign(this, obj);
}
}
Wenn ein anderer Benutzer nicht Typoskript mit und versucht , einen Parameter zu setzen , die nicht gehören, sagen wir, könnten sie versuchen , ein Putting - zEigenschaft
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')