2017-09-26 2 views
0

Ich würde gerne einen Konstruktor einer generischen Klasse definieren, die einen Callback nimmt, der eine Sammlung von einem der generischen Typen benötigt. Obwohl ich den Callback-Typ ohne eine Auflistung erfolgreich definieren kann, erhalte ich einen Fehler mit der Auflistung. Der Fehler ist "TS2371: Ein Parameterinitialisierer ist nur in einer Funktions- oder Konstruktorimplementierung zulässig".Typescript generischer Callback Typ Hinweis mit generischer Sammlung

Das gibt mir den Fehler, aber es ist die Typdefinition ich will:

import {List} from "immutable"; 
export class BackendToUI<BM, UM> { 
    constructor(private backendToUI: (BM, List<UM>) => UM) {} 
} 

Dies funktioniert, aber ist nicht der Typ, ich will:

export class BackendToUI<BM, UM> { 
    constructor(private backendToUI: (BM, UM) => UM) {} 
} 

ich das gleiche Problem bekommen mit UM[] und Array<UM>, so ist das Problem nicht auf ein Implementierungsproblem in der unveränderlichen Listentypdefinition zurückzuführen.

Definition der Art im Voraus auch nicht hilft, obwohl ich es nicht erwartet hatte:

import {List} from "immutable"; 
type backendToUIType<BM, UM> = (BM, List<UM>) => UM; 
export class BackendToUI<BM, UM> { 
    constructor(private backendToUI: backendToUIType<BM, UM>) {} 
} 

Wer weiß, wie diese Callback-Typ zu deklarieren?

Antwort

0

Beachten Sie, dass Parameternamen in Typpositionen in TypeScript nicht optional sind. Überall, wo Sie einen Funktionstyp wie diese

(BM, UM) => UM 

schrieb müssen Sie Parameternamen zu schreiben

(b: BM, u: UM) => UM 

z.B. Hier statt

constructor(private backendToUI: (BM, List<UM>) => UM) {} 

Sie benötigen

constructor(private backendToUI: (b: BM, u: List<UM>) => UM) {} 
+0

Danke, dumme Fehler meinerseits. Das funktioniert. – Malina

+0

Aus Gründen der Neugier, warum Typescript kompiliert die Definition ohne die Parameternamen und Sammlung? Warum kompiliert das speziell: 'Konstruktor (private backendToUI: (BM, UM) => UM) {}'? – Malina

+0

... beantworte ich meine eigene Frage ... das liegt daran, dass BM und UM als Parameternamen anstelle von Typen interpretiert werden. Oh! – Malina