Как передать необязательные параметры в TypeScript, опуская некоторые другие необязательные параметры?



учитывая следующую подпись:



export interface INotificationService {
error(message: string, title?: string, autoHideAfter?: number);
}


Как я могу вызвать функцию error() не указание параметра title, но установка autoHideAfter, чтобы сказать 1000?

788   8  

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);

Playground link.

к сожалению, в 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 будет иметь следующие варианты:

Overload intellisense

детская площадка

Вы можете сделать это без интерфейса.

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

    Ничего не найдено.