2017-12-27 15 views
0

Ich habe Variable, die entweder vom Typ C1[] oder C2<C1>[] sein können, wie ich einen Typ Guard für die Variable erstellen?Typescript generischen Typ Schutz

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

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

Die Methode isC wird nicht kompiliert.

Antwort

1

Es gibt mehrere Probleme, hier:

  1. Die isC Funktion benötigt Foo als Typ-Parameter. Das bedeutet, es wie folgt erklärt werden muss:

    private isC<Foo>(... 
    
  2. Der Rückgabetyp Definition von isC nicht seine Eingabeparameter entspricht. Der Rückgabetyp erklärt, dass isC kehrt true, wenn seine Parameter d Typ ist C<Foo>[], aber der Eingangstyp beschränkt sich auf Foo[] oder C<Foo> (keiner von ihnen C<Foo>[] ist). arbeiten

    sollte diese Erklärung:

    private isC<Foo>(d: Foo[] | C<Foo>[]): d is C<Foo>[] { ... 
    
  3. (<C<Foo>>)d[0] ist kein gültiger Typ gegossen. Versuchen Sie diese statt:

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

Auch diese playground with compiling example sehen.

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