如何在打字稿中将参数从数量可变的一个函数传递给参数可变的另一个函数?

时间:2019-06-17 10:36:49

标签: typescript

这不起作用

static myDebug(message: string, ...optionalParameters: any[]): void {
    // tslint:disable-next-line
    console.debug(message, optionalParameters);
}

它只写这样的行

test myDebug this.url = Array(2), windowId = %d

代替

test myDebug this.url = /myurl, windowId = 123

在C语言中无法做到这一点,所以我需要这样做:

    va_start(Args, Message);
    vsnprintf_s(Buffer, sizeof(Buffer), _TRUNCATE, Format, Args);
    va_end(Args);
    CallTheFunction(Buffer);

2 个答案:

答案 0 :(得分:1)

如果要记录其余阵列的条目而不是其余阵列本身,则将其展开:

static myDebug(message: string, ...optionalParameters: any[]): void {
    // tslint:disable-next-line
    console.debug(message, ...optionalParameters);
    // --------------------^^^
}

在许多方面,扩展语法是rest语法的补充。

如果您这样叫myDebug,请使用它:

myDebug("hi there", 1, 2, 3);

它会这样调用console.debug(有效):

console.debug(message, optionalParameters[0], optionalParameters[1], optionalParameters[2]);

答案 1 :(得分:0)

您可以通过使用具有可选参数的对象来解决此问题,这还将使您对所有选项都具有很好的自动补全功能。使用any是有风险的,因为您可能有错别字或传递从未使用过的参数。我假设您使用Typescript来获得类型安全性。

interface OptionalParameters {
    name?:string
}

static myDebug(p: OptionalParameters): void {
    console.dir(p)
}

在调用myDebug时,您可以传递一个空对象或具有name参数的对象。

myDebug({})                              // ok
myDebug({name:"hello"})                  // ok
myDebug({name:"hello", test:"world"})    // test is not an option