Дано такий підпис:
export interface INotificationService {
error(message: string, title?: string, autoHideAfter?: number);
}
Як я можу викликати функцію error() не вказуючи titleпараметр, а налаштування autoHideAfterсказати 1000?
Дано такий підпис:
export interface INotificationService {
error(message: string, title?: string, autoHideAfter?: number);
}
Як я можу викликати функцію error() не вказуючи titleпараметр, а налаштування autoHideAfterсказати 1000?
Відповіді:
Як зазначено в документації , використовуйте 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);
undefinedщоб отримати таку саму поведінку, як повністю випускати аргумент. Просто "все, що не є правдою", не буде працювати, тому що TypeScript насправді порівнює з тим, void 0що це більш безпечний спосіб написання undefined. )
На жаль, у TypeScript нічого подібного немає (детальніше тут: https://github.com/Microsoft/TypeScript/isissue/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 - це масив необов'язкових парамЩе один підхід:
error(message: string, options?: {title?: string, autoHideAfter?: number});
Отже, коли ви хочете опустити параметр заголовка, просто надішліть такі дані:
error('the message', { autoHideAfter: 1 })
Я вважаю за краще цей параметр, оскільки дозволяє мені додавати більше параметрів без необхідності надсилати інші.
title?
Це майже те саме, що відповідь @Brocco, але з невеликим поворотом: передайте лише об'єктивні параметри в об'єкт. (А також зробіть об'єкт парами необов’язковим).
Це в кінцевому підсумку схоже на ** kwargs 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буде мати наступні варіанти:

Ви можете створити допоміжний метод, який приймає базу параметрів одного об’єкта на аргументах помилок
error(message: string, title?: string, autoHideAfter?: number){}
getError(args: { message: string, title?: string, autoHideAfter?: number }) {
return error(args.message, args.title, args.autoHideAfter);
}
Ви можете спробувати встановити заголовок на null.
Це працювало для мене.
error('This is the ',null,1000)
Це можна зробити без інтерфейсу.
class myClass{
public error(message: string, title?: string, autoHideAfter? : number){
//....
}
}
використовувати ?оператор як необов'язковий параметр.
messageіautoHideAfter
?додано у визначенні функції , але питання стосується фактичного виклику функції.