2017-12-27 384 views
0

我有一個變量,可以是C1[]C2<C1>[]類型,我該如何爲變量創建一個類型後衛?typescript generic type guard

interface C<T>{ 
    key: string; 
    secret: T; 
} 

private isC(d: Foo[] | C<Foo>): d is C<Foo>[] { 
    return (<C<Foo>>)d[0].key !== undefined 
} 

方法isC沒有編譯。

回答

1

有多個問題,在這裏:

  1. isC功能需要Foo作爲一個類型參數。這意味着它需要聲明如下:

    private isC<Foo>(... 
    
  2. isC返回類型定義不匹配其輸入參數。返回類型聲明isC返回true,當其參數d類型C<Foo>[],但輸入類型被限制爲Foo[]C<Foo>(它們都不是C<Foo>[])。

    此申報工作:

    private isC<Foo>(d: Foo[] | C<Foo>[]): d is C<Foo>[] { ... 
    
  3. (<C<Foo>>)d[0]不是有效的類型轉換。試試這個,而是:

    return (d as C<Foo>[])[0].key !== undefined 
    

也看到這個playground with compiling example

0
private isC(d: Foo[] | C<Foo>): d is C<Foo>[] { 
    return (d as C<Foo>[])[0].key !== undefined 
}