2016-07-23 6 views
1

Ich habe mich gefragt, warum Typoskript mit dem folgenden Fehler klagt:Typoskript Fehler mit Zip-Funktion in Lodash

(22,28): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. 
    Type argument candidate 'string' is not a valid type argument because it is not a supertype of candidate 'number[]'. 

, wenn ich die Zip-Funktion mit den folgenden Argumenten verwenden:

let ranges = ["0-100", "100-200", "200-300", "300-400", "400-500"]; 
let arrays = [[19.99, 49.99, 49.99, 49.99, 29.99, 29.99, 9.99, 29.99, 34.99, 34.99, 59.99], [149.99, 179.99, 129.99, 149.99, 129.99, 199.99, 129.99], [209.99, 249.99, 292.99, 279.99, 219.99]]; 

let result = _.zip(ranges, arrays); 

Allerdings, wenn ich Verwenden Sie _.zipObject, der Fehler verschwindet.

Wenn es wichtig ist, habe ich die Typinformationen mit typings install lodash --save installiert.

UPDATE 2

Ich denke zip nicht mit unterschiedlichen Argumenten erhalten mag. In diesem Fall ist ranges vom Typ string[] und arrays vom Typ number[].

UPDATE

Ich war falsch. Ich habe die Werte von arrays Strings zu verwenden, aber jetzt bekomme ich diese etwas andere Fehler:

(24,28): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. 
    Type argument candidate 'string' is not a valid type argument because it is not a supertype of candidate 'string[]'. 

Vielleicht gibt es etwas zu verschachtelten Arrays in der Variablen arrays verwandt?

+0

Was ist mit der expliziten Angabe von Union-Typ als generischer Parameter? '_.zip (...)' –

+0

Danke. Lass es mich versuchen. –

+0

Nein, funktioniert immer noch nicht. Ich nehme an, Sie wollten explizit eingeben, was die erwartete Ausgabe für '_.zip' ist. Ich denke, das wäre eine Anordnung von Arrays. –

Antwort

4

Sie haben Recht, dass zip Argumente verschiedener Typen nicht mögen. Wie hier definiert ...

zip<T>(...arrays: List<T>[]): T[][]; 

Dies bedeutet im Grunde, dass alle Parameter ein Array des gleichen Typs sein müssen. Wenn Sie jedoch Arrays zu Strings änderten, vermute ich, dass Sie so etwas wie ...

haben
let ranges = ["0-100", "100-200", "200-300", "300-400", "400-500"]; 
let arrays = [["19.99", "49.99",...], ["149.99", ...], ...]; 

Diese sind immer noch nicht den gleichen Typ. ranges ist ein eindimensionales Array von Strings (Array von string) und Arrays ist ein zweidimensionales Array von Strings (Array von string[]). Ein gültiger Satz von Eingängen wäre etwa wie ...

let ranges = ["0-100", "100-200"]; 
let arrays = ["19.99", "49.99"]; 

Hier sind beide Typen Arrays von Strings. Ich vermute jedoch, dass dies nicht das ist, was Sie wollen. Ist Ihre gewünschte Ausgabe ungefähr wie folgt?

[["0-100", ["19.99", ...]], ["100-200", ["149.99", ...]], ...] 

Wenn ja, dann können Sie einfach tun ...

_.zip<any>(ranges, arrays); 

Das Typoskript T zu zwingen, sagt zu sein any so die Funktionsdefinition wird ...

zip(...arrays: List<any>[]): any[][]; 

Beispiel:

let ranges = ["0-100", "101-200"]; 
let arrays = [[0, 1, 2], [3, 4, 5]]; 
_.zip<any>(ranges, arrays); 
//[ [ '0-100', [ 0, 1, 2 ] ], [ '101-200', [ 3, 4, 5 ] ] ] 

UPDATE: Wie in den Kommentaren erwähnt, könnten Sie auch tun ...

_.zip<string|number[]>(ranges, arrays); 
+0

Danke. Ausgezeichnete Antwort. Ich war verwirrt über die Typen, die in den definitiv typisierten Definitionen verwendet wurden. Ein paar Fragen: Was ist der 'List' Typ im Zusammenhang mit' List [] '? Wie liest du ''? –

+1

@RobertSmith '' - Entweder Zeichenfolge oder Zahlenfeld, '<(string | number) []>' - entweder Array mit Strings oder Array mit Zahlen. Siehe [Unionstypen] (https://www.typescriptlang.org/docs/handbook/advanced-types.html) –

+1

"List" ist an anderer Stelle in den lodash-Typdefinitionen definiert. Es soll etwas allgemeiner als Arrays sein, um jQuery-Objekte einzubeziehen. Man könnte es sich als '' vorstellen, außer dass es keinen gemeinsamen Typ für jQuery-Objekte gibt, so dass sie etwas anders definiert sind (z. B. alles, was mit einer Eigenschaft 'length 'indexierbar ist). Das '...' ist eine Art zu sagen, [lassen Sie null oder mehr Argumente] (http://stackoverflow.com/questions/12697275/open-ended-function-arguments-with-typescript). Diese Funktion kann also 1, 2, 3 oder beliebig viele Elemente enthalten. Jedes Element muss eine "Liste " sein. – Pace