接受数组或变量/ rest参数的函数的定义和实现

时间:2014-07-02 09:37:25

标签: typescript

函数fn具有重载签名:

public fn(...arg:T[]);
public fn(args:T[]);

以便可以使用fnfn([T1,T2,T3])

调用fn(T1,T2,T3)

什么是最好的"该功能的定义? (鼓励我的IDE强制执行打字并尽可能避免参数类型测试样板文件)

显然,我可以在实现中实现fn(args)定义和测试typeof arguments[0],但似乎因为两者都有T[]类型的参数,所以可以做一些不太通用的事情

(打字稿1.0.1)

修改

我想避免的是这样的事情:

public fn(...arg:string[]);
public fn(args:string[]);
public fn() {
    if (typeof arguments[0] === 'string') {
          //fn(...args:string[]) called
    }
    else {

    }
}

这严重削弱了宣告的目的

public fn(...arg:string[]);
public fn(args:string[]);

首先,在两种情况下参数类型都为string[]这一事实无法获益

(将实现fn()的定义声明为私有将是一种改进,但所有定义必须具有相同的可见性)

1 个答案:

答案 0 :(得分:1)

我的建议是实现rest参数版本。如果真的需要使用数组调用该版本,您仍然可以使用apply

class Example {
    test(...strArray: string[]) {
        alert(strArray.length.toString());
    }
}

var example = new Example();

example.test('a', 'b', 'c');

example.test.apply(null, ['a', 'b', 'c']);

现在,您不会对传递给应用的参数进行类型检查 - 所以如果这很重要,那么我建议您使用两种方法:

class Example {
    test(...strArray: string[]) {
        this.testWithArray(strArray);
    }

    testWithArray(strArray: string[]) {
        alert(strArray.length.toString());
    }
}

var example = new Example();

example.test('a', 'b', 'c');

example.testWithArray(['a', 'b', 'c']);

如果在此处更改最终调用中的参数类型,则会进行类型检查。

由于你在问题中描述的问题,你不能用两者重载方法 - 所以你可以使用TypeScript编译器来完成工作(它会为你映射参数)或者你自己完成所有工作如果你想要两种方法。在这种情况下,没有任何神奇的方法可以获得两者。