Compte tenu de la signature suivante:
export interface INotificationService {
error(message: string, title?: string, autoHideAfter?: number);
}
Comment appeler la fonction error () not en spécifiant le paramètre title, mais en définissant autoHideAfter sur 1000?
Comme spécifié dans la documentation , utilisez undefined
:
export interface INotificationService {
error(message: string, title?: string, autoHideAfter? : number);
}
class X {
error(message: string, title?: string, autoHideAfter?: number) {
console.log(message, title, autoHideAfter);
}
}
new X().error("hi there", undefined, 1000);
Malheureusement, il n’ya rien de tel dans TypeScript (plus de détails ici: https://github.com/Microsoft/TypeScript/issues/467
Mais pour contourner cela, vous pouvez changer vos paramètres pour qu’ils deviennent une interface:
export interface IErrorParams {
message: string;
title?: string;
autoHideAfter?: number;
}
export interface INotificationService {
error(params: IErrorParams);
}
//then to call it:
error({message: 'msg', autoHideAfter: 42});
vous pouvez utiliser variable optionnelle de ?
ou si vous avez plusieurs variables optionnelles de ...
, par exemple
function details(name: string, country="CA", address?: string, ...hobbies: string) {
// ...
}
Au dessus:
name
est requiscountry
est requis et a une valeur par défautaddress
est facultatifhobbies
est un tableau de paramètres facultatifsCeci est presque identique à la réponse de @Brocco, mais avec une légère torsion: ne passe que des paramètres facultatifs dans un objet. (Et aussi rendre optionnel objet params).
Il finit par être un peu comme ** kwargs de Python, mais pas exactement.
export interface IErrorParams {
title?: string;
autoHideAfter?: number;
}
export interface INotificationService {
// make params optional so you don't have to pass in an empty object
// in the case that you don't want any extra params
error(message: string, params?: IErrorParams);
}
// all of these will work as expected
error('A message with some params but not others:', {autoHideAfter: 42});
error('Another message with some params but not others:', {title: 'StackOverflow'});
error('A message with all params:', {title: 'StackOverflow', autoHideAfter: 42});
error('A message with all params, in a different order:', {autoHideAfter: 42, title: 'StackOverflow'});
error('A message with no params at all:');
Vous pouvez spécifier plusieurs signatures de méthode sur l'interface, puis plusieurs surcharges de méthode sur la méthode class:
interface INotificationService {
error(message: string, title?: string, autoHideAfter?: number);
error(message: string, autoHideAfter: number);
}
class MyNotificationService implements INotificationService {
error(message: string, title?: string, autoHideAfter?: number);
error(message: string, autoHideAfter?: number);
error(message: string, param1?: (string|number), param2?: number) {
var autoHideAfter: number,
title: string;
// example of mapping the parameters
if (param2 != null) {
autoHideAfter = param2;
title = <string> param1;
}
else if (param1 != null) {
if (typeof param1 === "string") {
title = param1;
}
else {
autoHideAfter = param1;
}
}
// use message, autoHideAfter, and title here
}
}
Maintenant tout cela fonctionnera:
var service: INotificationService = new MyNotificationService();
service.error("My message");
service.error("My message", 1000);
service.error("My message", "My title");
service.error("My message", "My title", 1000);
... et la méthode error
de INotificationService
auront les options suivantes:
Une autre approche est:
error(message: string, options?: {title?: string, autoHideAfter?: number});
Donc, lorsque vous voulez omettre le paramètre title, envoyez simplement les données comme ça:
error('the message', { autoHideAfter: 1 })
Je préférerais cette option car cela me permet d'ajouter plus de paramètres sans avoir à envoyer les autres.
Vous pouvez créer une méthode d'assistance qui accepte un paramètre à un objet basé sur des arguments d'erreur.
error(message: string, title?: string, autoHideAfter?: number){}
getError(args: { message: string, title?: string, autoHideAfter?: number }) {
return error(args.message, args.title, args.autoHideAfter);
}
vous pouvez essayer de mettre le titre à null.
Cela a fonctionné pour moi.
error ('Ceci est le', null, 1000)
Vous pouvez le faire sans interface.
class myClass{
public error(message: string, title?: string, autoHideAfter? : number){
//....
}
}
utilisez l'opérateur ?
en tant que paramètre facultatif.