Σημείωση: αυτή απλοποιήθηκε και ενημέρωση 13/04/2017 να αντικατοπτρίζουν γραφομηχανή 2.1, δείτε το ιστορικό για γραφομηχανή 1.8 απάντηση.
Ακούγεται σαν να θέλετε η παράμετρος αντικείμενο να είναι προαιρετική, καθώς επίσης και κάθε μία από τις ιδιότητες του αντικειμένου να είναι προαιρετική. Στο παράδειγμα, όπως προβλέπεται, σύνταξη υπερφόρτωσης δεν είναι απαραίτητη. Ήθελα να επισημάνω κάποιες κακές πρακτικές στον κάποιες από τις απαντήσεις εδώ. Σύμφωνοι, δεν είναι η μικρότερη δυνατή έκφραση ουσιαστικά γραφής box = { x: 0, y: 87, width: 4, height: 0 }, αλλά αυτό παρέχει όλες τις υπαινίχθηκε λεπτότητα κώδικα που θα μπορούσε ενδεχομένως να θέλουν από την τάξη, όπως περιγράφεται. Αυτό το παράδειγμα σας επιτρέπει να καλέσετε μια συνάρτηση με μία, κάποια, όλα, ή καμία από τις παραμέτρους και να πάρετε ακόμα προκαθορισμένες τιμές.
/** @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;
}
}
Αυτή είναι μια πολύ ασφαλής τρόπος για να γράψει για τις παραμέτρους που μπορεί να μην έχουν όλες τις ιδιότητες του αντικειμένου ορίζεται. Τώρα μπορείτε να γράψετε με ασφάλεια οποιοδήποτε από αυτά:
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});
Καταρτίζονται, θα δείτε ότι οι προαιρετικές παραμέτρους πραγματικά είναι προαιρετικές, που αποφεύγει τις παγίδες ενός ευρέως χρησιμοποιείται (αλλά επιρρεπής σε λάθη) εναλλακτική σύνταξη var = isOptional || default;από τον έλεγχο κατά void 0, το οποίο είναι συντομογραφία για undefined:
Η Καταρτίζονται εξόδου
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;
}());
Προσθήκη: Ρύθμιση προεπιλεγμένες τιμές: με λάθος τρόπο
Η ||(ή) χειριστή
Σκεφτείτε τον κίνδυνο ||ή / και φορέων κατά τη ρύθμιση προεπιλεγμένες εναλλακτικές τιμές, όπως φαίνεται σε κάποιες άλλες απαντήσεις. Παρακάτω Αυτός ο κωδικός απεικονίζει τη λάθος τρόπος για να ορίσετε προεπιλογές. Μπορείτε να πάρετε μη αναμενόμενα αποτελέσματα κατά την αξιολόγηση κατά falsey αξίες όπως 0, «», null, απροσδιόριστο, ψευδή, 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 (αυτό, obj)
Στις δοκιμές μου, χρησιμοποιώντας ES6 / γραφομηχανή αποδομείται αντικείμενο μπορεί να είναι σχεδόν 90% πιο γρήγορα από ό, τι Object.assign . Χρησιμοποιώντας ένα αποδομημένο η παράμετρος επιτρέπει μόνο τις μεθόδους και τις ιδιότητες που έχετε εκχωρήσει στο αντικείμενο. Για παράδειγμα, θεωρούν αυτή τη μέθοδο:
class BoxTest {
public x?: number = 1;
constructor(obj: BoxTest = {} as BoxTest) {
Object.assign(this, obj);
}
}
Αν κάποιος άλλος χρήστης δεν χρησιμοποιούσε γραφομηχανή και προσπάθησε να τοποθετήσει μια παράμετρο που δεν ανήκουν, για παράδειγμα, θα μπορούσαν να δοκιμάστε να βάλετε ένα zακίνητο
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')