角管道和TypeScript类型防护

时间:2018-07-27 08:33:26

标签: angular typescript angular-pipe

我了解了打字稿herehere中的类型保护。但是我仍然会遇到编译器错误。

  

错误:(21,14)TS2349:无法调用类型缺少表达式的表达式   呼叫签名。输入'{(callbackfn:(value:Foo,   索引:数字,数组:Foo ...”没有兼容的呼叫签名。

我有以下课程:

Foo.ts

IF(InStr(Cells(x,y).Value,"$">0)) then Cells(x+1,y).Value=Cells(x,y).Value*change_rate

Bar.ts

export class Foo {
  expired: boolean;
}

MyPipe.ts

export class Bar {
  foo: Foo;
}

问题是,如何在使用打字稿的角管道中同时实现对参数“项目”的联合绑定和类型防护的使用?

1 个答案:

答案 0 :(得分:1)

Typescript通常不会根据字段的类型来缩小变量的类型(带区别的并集除外)。更具体地说,打字稿不会基于数组索引进行缩小(这是已知的限制)

您可以做的最简单的事情是使用类型断言,或更优雅的解决方案是使用自定义类型防护:

class Foo { private x: string; expired: boolean }
class Bar { private x: string; foo: Foo }

function isArrayOf<T>(ctor: new (...args: any[]) => T, arr: any): arr is T[] {
    return arr[0] instanceof ctor
}

export class MyPipe {
    transform(items: Foo[] | Bar[], isExpired: Boolean): Foo[] | Bar[] {
        if (!items) {
            return items;
        }

        if (isArrayOf(Foo, items) {
            return items.filter((foo: Foo) => {
                return foo.expired == isExpired;
            });
        } else {
            return items.filter((bar: Bar) => {
                return bar.foo.expired == isExpired;
            });
        }
    }
}

Playground link