Как передать необязательные параметры в TypeScript, опуская некоторые другие необязательные параметры?
учитывая следующую подпись:
export interface INotificationService {
error(message: string, title?: string, autoHideAfter?: number);
}
Как я могу вызвать функцию error() не указание параметра title, но установка autoHideAfter, чтобы сказать 1000?
8 ответов:
Как указано в документация используйте
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);
к сожалению, в 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});
вы можете использовать необязательную переменную по
?или если у вас есть несколько необязательных переменной..., например:function details(name: string, country="CA", address?: string, ...hobbies: string) { // ... }выше:
nameтребуетсяcountryнеобходим и имеет значение по умолчаниюaddressнеобязательноhobbies- это массив необязательных параметров
Это почти то же самое, что и ответ @Brocco, но с небольшим поворотом: только передать необязательные параметры в объекте. (а также сделать params объект необязательным).
в конечном итоге это похоже на **кварги Python, но не совсем.
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:');
вы можете указать несколько сигнатур метода на интерфейсе, а затем иметь несколько перегрузок метода в методе класса:
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будет иметь следующие варианты:
Вы можете сделать это без интерфейса.
class myClass{ public error(message: string, title?: string, autoHideAfter? : number){ //.... } }использовать
?оператор в качестве необязательного параметра.
вы можете попытаться установить title В null.
Это работает для меня.
ошибка ('This is the', null, 1000)
другой подход:
error(message: string, options?: {title?: string, autoHideAfter?: number});поэтому, когда вы хотите опустить параметр title, просто отправьте данные как то:
error('the message', { autoHideAfter: 1 })Я бы предпочел эти параметры, потому что позволяет мне добавить больше параметров без необходимости отправлять другие.

Comments