Définition de la valeur par défaut pour l’object TypeScript passé en argument

function sayName(params: {firstName: ssortingng; lastName?: ssortingng}) { params.lastName = params.lastName || 'smith'; // <<-- any better alternative to this? var name = params.firstName + params.lastName alert(name); } sayName({firstName: 'bob'}); 

J’avais imaginé que quelque chose comme ça pourrait fonctionner:

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

Évidemment, si ces arguments étaient simples, vous pourriez le faire avec:

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

Et dans coffeescript, vous avez access à l’opérateur d’existence conditionnelle, vous pouvez donc faire:

 param.lastName ?= 'smith' 

Qui comstack pour le javascript:

 if (param.lastName == null) { param.lastName = 'smith'; } 

En fait, il semble y avoir maintenant un moyen simple. Le code suivant fonctionne dans TypeScript 1.5:

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

L’astuce consiste à mettre d’abord entre parenthèses les clés que vous voulez choisir dans l’object argument, avec key=value pour les valeurs par défaut. Suivez cela avec le : et une déclaration de type.

C’est un peu différent de ce que vous essayiez de faire, car au lieu d’avoir un object params intact, vous avez plutôt des variables déréférencées.

Si vous voulez le rendre facultatif pour passer quoi que ce soit à la fonction, ajoutez un ? pour toutes les clés du type et append une valeur par défaut de ={} après la déclaration de type:

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

Non, TypeScript n’a pas de moyen naturel de définir des valeurs par défaut pour les propriétés d’un object défini comme celui où l’une a une valeur par défaut et l’autre pas. Vous pouvez définir une structure plus riche:

 class Name { constructor(public first : ssortingng, public last: ssortingng = "Smith") { } } 

Et utilisez-le à la place de la définition de type en ligne.

 function sayName(name: Name) { alert(name.first + " " + name.last); } 

Vous ne pouvez pas faire quelque chose comme ça malheureusement:

 function sayName(name : { first: ssortingng; last?:ssortingng } /* and then assign a default object matching the signature */ = { first: null, last: 'Smith' }) { } 

Comme il ne définirait que la valeur par défaut si le name était undefined .

Typescript supporte maintenant les parameters par défaut:

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

De plus, l’ajout d’une valeur par défaut vous permet d’omettre la déclaration de type, car elle peut être déduite de la valeur par défaut:

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

La déstructuration d’object de l’object paramètre est ce que plusieurs des réponses ci-dessus visent et Typescript a maintenant les méthodes en place pour le rendre beaucoup plus facile à lire et à comprendre intuitivement.

Notions de base sur la destruction: En déstructurant un object, vous pouvez choisir les propriétés d’un object par nom de clé. Vous pouvez définir autant ou autant de propriétés que vous le souhaitez, et les valeurs par défaut sont définies par une syntaxe de base de let {key = default} = object .

 let {firstName, lastName = 'Smith'} = myParamsObject; //Comstacks to: var firstName = myParamsObject.firstName, _a = myParamsObject.lastName, lastName = _a === void 0 ? 'Smith' : _a; 

L’écriture d’une interface, d’un type ou d’une classe pour l’object paramètre améliore la lisibilité.

 type FullName = { firstName: ssortingng; /** @default 'Smith' */ lastName ? : ssortingng; } 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' }); 

Cela peut être un bon moyen de le faire sans impliquer de longs constructeurs

 class Person { firstName?: ssortingng = 'Bob'; lastName?: ssortingng = 'Smith'; // Pass in this class as the required params constructor(params: Person) { // object.assign will overwrite defaults if params exist Object.assign(this, params) } } // you can still use the typing function sayName(params: Person){ let name = params.firstName + params.lastName alert(name) } // you do have to call new but for my use case this felt better sayName(new Person({firstName: 'Gordon'})) sayName(new Person({lastName: 'Thomas'}))