函数fn
具有重载签名:
public fn(...arg:T[]);
public fn(args:T[]);
以便可以使用fn
或fn([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()
的定义声明为私有将是一种改进,但所有定义必须具有相同的可见性)
答案 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编译器来完成工作(它会为你映射参数)或者你自己完成所有工作如果你想要两种方法。在这种情况下,没有任何神奇的方法可以获得两者。