Как передать необязательные параметры, опуская некоторые другие необязательные параметры?
Учитывая следующую подпись:
export interface INotificationService {
error(message: string, title?: string, autoHideAfter?: number);
}
Как я могу вызвать функцию error()
не указав параметр title
, но установив autoHideAfter
чтобы сказать 1000
?
Ответы
Ответ 1
Как указано в документации, используйте 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);
Игровая площадка.
Ответ 2
К сожалению, в TypeScript нет ничего подобного (подробнее здесь: https://github.com/Microsoft/TypeScript/issues/467)
Но чтобы обойти это, вы можете изменить свои параметры как интерфейс:
export interface IErrorParams {
message: string;
title?: string;
autoHideAfter?: number;
}
export interface INotificationService {
error(params: IErrorParams);
}
//then to call it:
error({message: 'msg', autoHideAfter: 42});
Ответ 3
вы можете использовать необязательную переменную ?
или если у вас есть несколько необязательных переменных ...
, например:
function details(name: string, country="CA", address?: string, ...hobbies: string) {
// ...
}
В приведенном выше:
-
name
требуется
-
country
требуется и имеет значение по умолчанию
-
address
является необязательным
-
hobbies
- это массив необязательных параметров
Ответ 4
Другой подход:
error(message: string, options?: {title?: string, autoHideAfter?: number});
Поэтому, если вы хотите опустить параметр title, просто отправьте данные следующим образом:
error('the message', { autoHideAfter: 1 })
Я бы предпочел эту опцию, потому что позволяет мне добавить больше параметров, не отправляя другие.
Ответ 5
Это почти то же самое, что и ответ @Brocco, но с небольшим завихрением: передает только необязательные параметры в объекте. (А также сделать объект params необязательным).
В конечном итоге это похоже на Python ** kwargs, но не совсем.
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:');
Ответ 6
Вы можете указать несколько сигнатур методов на интерфейсе, а затем иметь несколько перегрузок методов для метода класса:
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
}
}
Теперь все это будет работать:
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);
... и метод error
INotificationService
будет иметь следующие параметры:
![Overload intellisense]()
param1;
}
else if (param1 != null) {
if (typeof param1 === "string") {
title= param1;
}
else {
autoHideAfter = param1;
}
}
console.log(message, title, autoHideAfter);
}
}
var service = new MyNotificationService();
service.error("My message");
service.error("My message", 1000);
service.error("My message", "My title");
service.error("My message", "My title", 1000); rel="nofollow noreferrer">Детская площадка
Ответ 7
Вы можете создать вспомогательный метод, который принимает один параметр объекта на основе аргументов ошибки
error(message: string, title?: string, autoHideAfter?: number){}
getError(args: { message: string, title?: string, autoHideAfter?: number }) {
return error(args.message, args.title, args.autoHideAfter);
}
Ответ 8
Вы можете сделать это без интерфейса.
class myClass{
public error(message: string, title?: string, autoHideAfter? : number){
//....
}
}
используйте оператор ?
в качестве необязательного параметра.
Ответ 9
Вы можете попытаться установить для заголовка значение null.
Это сработало для меня.
error('This is the ',null,1000)