2017-12-27 63 views
0

私は変数またはC2<C1>[]のいずれかを指定できます。変数の型ガードを作成するにはどうすればよいですか?typescriptジェネリック型ガード

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の戻り値の型の定義は、その入力パラメータと一致していない:これは、次のように宣言する必要があることを意味します。戻り値の型は、パラメータdがタイプC<Foo>[]の場合isCtrueを返すと宣言しますが、入力タイプは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 
} 
関連する問題