我了解了打字稿here和here中的类型保护。但是我仍然会遇到编译器错误。
错误:(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;
}
问题是,如何在使用打字稿的角管道中同时实现对参数“项目”的联合绑定和类型防护的使用?
答案 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;
});
}
}
}