Note: ceci a été simplifié et mis à jour pour refléter 13/04/2017 tapuscrit 2.1, voir l'histoire pour la réponse tapuscrit 1.8.
On dirait que vous voulez que le paramètre objet à option, ainsi que chacune des propriétés de l'objet à être en option. Dans l'exemple, comme prévu, la syntaxe de surcharge n'est pas nécessaire. Je voulais souligner certaines mauvaises pratiques dans l'une des réponses ici. Certes, ce n'est pas la plus petite expression possible d'écrire essentiellement box = { x: 0, y: 87, width: 4, height: 0 }, mais cela fournit tous les conseils de code politesses que vous pourriez vouloir de la classe comme décrit. Cet exemple vous permet d'appeler une fonction avec un, certains, tous, ou aucun des paramètres et obtenez toujours des valeurs par défaut.
/** @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;
}
}
Ceci est un moyen très sûr d'écrire pour les paramètres qui peuvent ne pas avoir toutes les propriétés de l'objet défini. Vous pouvez maintenant en toute sécurité écrire un de ces:
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});
Compilé, vous voyez que les paramètres facultatifs sont vraiment en option, qui permet d' éviter les pièges d'un largement utilisé (mais sujette aux erreurs) syntaxe de repli var = isOptional || default;en vérifiant contre void 0, ce qui est un raccourci pour undefined:
La sortie compilée
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: Définition des valeurs par défaut: la mauvaise façon
L' ||opérateur (ou)
Considérez le danger de ||/ ou les opérateurs lors de la configuration des valeurs de repli par défaut comme indiqué dans d'autres réponses. Ce code ci - dessous illustre la mauvaise façon de définir les valeurs par défaut. Vous pouvez obtenir des résultats inattendus lors de l' évaluation contre Falsey valeurs telles que 0, « », null, non défini, faux, 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 (ce, obj)
Dans mes tests, en utilisant ES6 / tapuscrit objet déstructuré peut être près de 90% plus rapide que Object.assign . L' utilisation d' un paramètre déstructuré ne permet que des méthodes et des propriétés que vous avez attribué à l'objet. Par exemple, considérons cette méthode:
class BoxTest {
public x?: number = 1;
constructor(obj: BoxTest = {} as BoxTest) {
Object.assign(this, obj);
}
}
Si un autre utilisateur n'a pas utilisé tapuscrit et a tenté de placer un paramètre qui ne lui appartenait pas, par exemple, ils pourraient essayer de mettre une zpropriété
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')