2015-08-25 47 views
0

我已经在TypeScript中定义了一个类型Filter,它可以是string,RegExpPredicator,这是一个函数。类型定义如下。TypeScript中的函数类型警卫

export type Predicator = (input: string) => boolean; 
export type SingleFilter = string | RegExp | Predicator; 

有一个函数以SingleFilter作为输入。但是,只要RegExp主张,类型警卫似乎不能与Predicator一起工作。 但是,如果仅仅是string | Predicator,问题就消失了。

function singlePredicator(value: any) { 
    if (typeof value === 'string') { 
    // do something for string 
    } 
    else if (value instanceof RegExp) { 
    // do something 
    } 
    else { 
    // do something for function 
    // Error TS2349: Cannot invoke an expression whose type lacks a call signature. 
    value(foo); 
    } 
} 

是否有任何解决方案,使其在我的情况下工作?谢谢。我正在使用tsc 1.5.3

回答

1

以下示例中的第一项更改是,我输入了value参数SingleFilter而不是“any”。

第二个变化是最后else语句中的类型断言,以暗示编译器valuePredicator

export type Predicator = (input: string) => boolean; 
export type SingleFilter = string | RegExp | Predicator; 

function singlePredicator(value: SingleFilter) { 
    if (typeof value === 'string') { 
    // do something for string 
    return value.charAt(0); 
    } else if (value instanceof RegExp) { 
    // do something 
    value.test("Something"); 
    } else { 
    // do something for function 
    var foo = "SomeFoo"; 
    value(foo); 
    } 
} 
+0

非常感谢,它现在有效。但是,仍然有什么办法让职业警卫在职能上工作? – Haocheng

+0

如果你有一个联合类型的'string | Function',它会按预期工作。 http://bit.ly/1NAKB3B - 同样适用于'string | number | Function',所以问题源于RegExp的instanceof检查。 – Fenton

+0

谢谢,这对我的情况是有意义的:) – Haocheng