我正在创建一个相当动态的库,我遇到了在Typescript中定义联合类型的问题,这是一个示例函数:
var forArray = function (scope : SampleClass, ary : Array<any>|Function, fn? : Array<any>|Function) {
fn = fn === undefined && scope.isFn(ary)
? ary
: fn;
ary = (scope.isFn(ary)) ? scope.clone(scope.src) : ary;
for (var i = 0, l = ary.length; i < l; i++) {
fn(ary[i], i, s);
}
};
我想要做的是创建一个动态的函数,但是我在编译期间遇到以下错误:
错误1:
无法调用类型缺少调用签名的表达式。
我完全理解错误,由于这一行,fn
基本上可以是一个数组:
fn = fn === undefined && scope.isFn(ary)
? ary // Since this is type Array<any>|Function
: fn;
如果我将fn
类型更改为fn? : Function
或fn? : (a, b, c) => any
,我会收到明显的错误:
错误:2
输入'any [] |函数'不能分配给'Function'类型。
或
输入'any [] |函数'不能赋予类型'(a:any,b:any,c:any)=&gt;任何”。
那么,是否有一种方法可以在最终用户中使用union类型,而不会抛出编译错误,尤其是在使用回调函数时?我错过了什么吗?
是的,我知道,如果我使用类型any
(或根本没有类型)我不会得到任何错误等,但我讨厌使用any
,除非我真的在寻找任何事情,我觉得我在那时滥用系统。
免责声明,虽然抛出了Error 1
以上,但它并不会阻止编译,因此代码可以正常工作。
答案 0 :(得分:0)
我个人不喜欢那些联盟类型。您可以在TypeScript主页上查看an example。除非您确定类型,否则不能使用此类型的函数。只需将return name.join(" ");
粘贴到所提供示例中的if-else语句之外的某处。
答案 1 :(得分:0)
我能够通过施法解决,我没有意识到打字稿有类型转换:
var forArray = function (scope : SampleClass, ary : Array<any>|Function, fn? : Function) {
fn = fn === undefined && scope.isFn(ary)
? <Function> ary
: fn;
ary = (scope.isFn(ary)) ? scope.clone(scope.src) : ary;
for (var i = 0, l = ary.length; i < l; i++) {
fn(ary[i], i, s);
}
};
我将fn? : Array<any>|Function
更改为fn?: Function
,因此我现在在回调上设置了严格的类型。然后我将f {1}添加到fn定义中的<Function>
。
ary
所有单元测试都已通过,并且没有任何编译错误。