为多个使用参数定义联合类型

时间:2015-11-05 17:06:27

标签: typescript

我正在创建一个相当动态的库,我遇到了在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? : Functionfn? : (a, b, c) => any,我会收到明显的错误:

错误:2

  

输入'any [] |函数'不能分配给'Function'类型。

     
    

  
     

输入'any [] |函数'不能赋予类型'(a:any,b:any,c:any)=&gt;任何”。

那么,是否有一种方法可以在最终用户中使用union类型,而不会抛出编译错误,尤其是在使用回调函数时?我错过了什么吗?

是的,我知道,如果我使用类型any(或根本没有类型)我不会得到任何错误等,但我讨厌使用any,除非我真的在寻找任何事情,我觉得我在那时滥用系统。

免责声明,虽然抛出了Error 1以上,但它并不会阻止编译,因此代码可以正常工作。

2 个答案:

答案 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

所有单元测试都已通过,并且没有任何编译错误。