Establecer el valor predeterminado para el objeto TypeScript pasado como argumento

Resuelto AJP asked hace 10 años • 8 respuestas
function sayName(params: {firstName: string; lastName?: string}) {
    params.lastName = params.lastName || 'smith';  // <<-- any better alternative to this?
    var name = params.firstName + params.lastName
    alert(name);
}

sayName({firstName: 'bob'});

Me había imaginado que algo como esto podría funcionar:

function sayName(params: {firstName: string; lastName: string = 'smith'}) {

Obviamente, si estos fueran argumentos simples, podrías hacerlo con:

function sayName(firstName: string, lastName = 'smith') {
    var name = firstName + lastName;
    alert(name);
}

sayName('bob');

Y en CoffeeScript tienes acceso al operador de existencia condicional, por lo que puedes hacer:

param.lastName ?= 'smith'

Que se compila en javascript:

if (param.lastName == null) {
    param.lastName = 'smith';
}
AJP avatar Apr 27 '14 01:04 AJP
Aceptado

En realidad, ahora parece haber una forma sencilla. El siguiente código funciona en TypeScript 1.5:

function sayName({ first, last = 'Smith' }: {first: string; last?: string }): void {
  const name = first + ' ' + last;
  console.log(name);
}

sayName({ first: 'Bob' });

El truco consiste en poner primero entre paréntesis las claves que desea seleccionar del objeto de argumento, key=valuepara cualquier valor predeterminado. Siga eso con :y una declaración de tipo.

Esto es un poco diferente de lo que intentaba hacer, porque en lugar de tener un paramsobjeto intacto, tiene variables desreferenciadas.

Si desea que sea opcional pasar algo a la función, agregue un ?para todas las claves del tipo y agregue un valor predeterminado de ={}después de la declaración de tipo:

function sayName({first='Bob',last='Smith'}: {first?: string; last?: string}={}){
    var name = first + " " + last;
    alert(name);
}

sayName();
jpadvo avatar Sep 15 '2015 21:09 jpadvo

Typecript admite parámetros predeterminados ahora:

https://www.typescriptlang.org/docs/handbook/functions.html

Además, agregar un valor predeterminado le permite omitir la declaración de tipo, porque se puede inferir del valor predeterminado:

function sayName(firstName: string, lastName = "Smith") {
  const name = firstName + ' ' + lastName;
  alert(name);
}

sayName('Bob');
encrest avatar Jul 06 '2017 00:07 encrest

La desestructuración de objetos del objeto parámetro es lo que apuntan muchas de las respuestas anteriores y Typecript ahora cuenta con los métodos para hacerlo mucho más fácil de leer y comprender intuitivamente.

Conceptos básicos de desestructuración: al desestructurar un objeto, puede elegir propiedades de un objeto por nombre de clave. Puede definir tantas propiedades como desee, y los valores predeterminados se establecen mediante una sintaxis básica de let {key = default} = object.

let {firstName, lastName = 'Smith'} = myParamsObject;

//Compiles to:
var firstName = myParamsObject.firstName, 
_a = myParamsObject.lastName, 
lastName = _a === void 0 ? 'Smith' : _a;

Escribir una interfaz, tipo o clase para el objeto de parámetro mejora la legibilidad.

type FullName = {
  firstName: string;
   
  /** @defaultValue 'Smith' */
  lastName ? : string;
}

function sayName(params: FullName) {

  // Set defaults for parameter object
  var { firstName, lastName = 'Smith'} = params;

  // Do Stuff
  var name = firstName + " " + lastName;
  alert(name);
}

// Use it
sayName({
  firstName: 'Bob'
});
Expandir fragmento

Benson avatar Aug 24 '2016 03:08 Benson