Nota: esto se simplifica y se actualiza para reflejar 04/13/2017 mecanografiado 2.1, ver la historia de mecanografiado 1.8 respuesta.
Parece que usted desea que el parámetro del objeto a ser opcional, y también cada una de las propiedades del objeto a ser opcional. En el ejemplo, según lo previsto, no se necesita la sintaxis de sobrecarga. Yo quería señalar algunas malas prácticas en las algunas de las respuestas aquí. Por supuesto, no es la expresión más pequeña posible de escribir en esencia box = { x: 0, y: 87, width: 4, height: 0 }, pero esto ofrece todas las sutilezas sugerencias para el código que pueda desear de la clase como se describe. Este ejemplo le permite llamar a una función con uno, algunos, todos, o ninguno de los parámetros y aún así obtener los valores por defecto.
/** @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;
}
}
Esta es una forma muy segura de escribir para los parámetros que pueden no tener todas las propiedades del objeto definido. Ahora puede escribir con seguridad alguna de estas:
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});
Compilado, se ve que los parámetros opcionales verdaderamente son opcionales, que evita las trampas de un ampliamente utilizado (pero propenso a errores) sintaxis de repliegue de var = isOptional || default;chequeando contra void 0, que es la abreviatura de undefined:
La salida compilada
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;
}());
Adición: Configuración de los valores por defecto: el camino equivocado
El ||(o) operador
Considere el peligro de ||/ o operadores de la hora de establecer los valores de retorno predeterminados como se muestra en algunas otras respuestas. Este código siguiente ilustra el camino equivocado para establecer los valores predeterminados. Puede obtener resultados inesperados cuando se evalúa contra Falsey valores como 0, '', null, indefinido, 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 (esto, obj)
En mis pruebas, utilizando objetos ES6 / mecanografiado desestructurado puede ser casi un 90% más rápido que Object.assign . El uso de un parámetro desestructurada sólo permite métodos y propiedades que ha asignado al objeto. Por ejemplo, considere este método:
class BoxTest {
public x?: number = 1;
constructor(obj: BoxTest = {} as BoxTest) {
Object.assign(this, obj);
}
}
Si otro usuario no estaba usando mecanografiado e intentó colocar un parámetro que no le pertenecía, por ejemplo, puede ser que trate de poner una zpropiedad
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')