请签名如下:

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

我如何调用函数error()不指定标题参数,但设置autoHideAfter说1000?


当前回答

您可以在没有接口的情况下做到这一点。

class myClass{
  public error(message: string, title?: string, autoHideAfter? : number){
    //....
  }
}

使用?运算符作为可选参数。

其他回答

这与@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:');

您可以尝试将title设置为null。

这对我很管用。

error('This is the ',null,1000)

你可以在接口上指定多个方法签名,然后在类方法上重载多个方法:

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

...INotificationService的error方法将有以下选项:

操场上

您可以在没有接口的情况下做到这一点。

class myClass{
  public error(message: string, title?: string, autoHideAfter? : number){
    //....
  }
}

使用?运算符作为可选参数。

在TS中,您还可以将参数设置为Object,并使对象的值可选,这样您就不必定义每个参数,只需定义您想要使用的参数即可。

公共函数beingcalled (obj:{状态?: number,错误?:字符串,消息?:字符串}){ If (obj.message) {console.log(obj.message)} } 这一点。functionBeingCalled({消息:'检测到错误'})