TypeScript-Version:
jede Nacht (1.9.0-dev.20160217)
Code
export interface QueryMetadataFactory {
(selector: Type | string, {descendants, read}?: {
descendants?: boolean;
read?: any;
}): ParameterDecorator;
new (selector: Type | string, {descendants, read}?: {
descendants?: boolean;
read?: any;
}): QueryMetadata;
}
Erwartetes Verhalten:
Wenn ich dies mit strengen Nullprüfungen kompiliere, würde ich erwarten, dass dies kompiliert wird, da die destrukturierten Variablen als optional markiert wurden, da dies funktioniert:
export interface QueryMetadataFactory {
(selector: Type | string, whatever?: {
descendants?: boolean;
read?: any;
}): ParameterDecorator;
new (selector: Type | string, whatever?: {
descendants?: boolean;
read?: any;
}): QueryMetadata;
}
Tatsächliches Verhalten:
Bei der Zusammenstellung:
node_modules/@angular/core/src/metadata.d.ts(356,32): error TS2459: Type '{ descendants?: boolean | undefined; read?: any; } | undefined' has no property 'descendants' and no string index signature.
node_modules/@angular/core/src/metadata.d.ts(356,45): error TS2459: Type '{ descendants?: boolean | undefined; read?: any; } | undefined' has no property 'read' and no string index signature.
node_modules/@angular/core/src/metadata.d.ts(360,36): error TS2459: Type '{ descendants?: boolean | undefined; read?: any; } | undefined' has no property 'descendants' and no string index signature.
node_modules/@angular/core/src/metadata.d.ts(360,49): error TS2459: Type '{ descendants?: boolean | undefined; read?: any; } | undefined' has no property 'read' and no string index signatu
Dieser ist grenzwertig. Die Funktion
function foo({ a, b }?: { a: number, b: number }) {
}
ist eigentlich ein Fehler, weil das Argument, das Sie zu zerstören versuchen, undefined
. Es wäre also nicht möglich, die genaue Signatur zu implementieren, die Sie in Ihrem Beispiel haben. Nun, wenn Sie die Deklaration in ändern
function foo({ a, b }: { a: number, b: number } = { a: 0, b: 0 }) {
}
Es ist kein Fehler mehr, da undefined
durch den Standardwert ersetzt wird. Aus Sicht des Aufrufers ist der Parameter jedoch weiterhin optional. Wenn Sie jetzt eine Deklarationsdatei generieren, spucken wir die Deklaration aus
declare function foo({ a, b }?: { a: number, b: number }): void;
was einen Fehler verursacht. Und das ist ein Fehler.
Abgesehen davon würde ich vorschlagen, Destrukturierungsparameter in nicht implementierten Signaturen zu vermeiden. Sie sind wirklich ein Implementierungsdetail, dh ob die Funktionsimplementierung das Argument zerstört oder nur den Eigenschaftszugriff verwendet, sollte den Aufrufer nicht wirklich betreffen. Im Fall der Deklarationsdatei geben wir jedoch (widerwillig) das Destrukturierungsmuster aus, da wir keinen tatsächlichen Parameternamen zum Ausgeben haben, und müssen daher den Fehler beheben.
Hilfreichster Kommentar
Dieser ist grenzwertig. Die Funktion
ist eigentlich ein Fehler, weil das Argument, das Sie zu zerstören versuchen,
undefined
. Es wäre also nicht möglich, die genaue Signatur zu implementieren, die Sie in Ihrem Beispiel haben. Nun, wenn Sie die Deklaration in ändernEs ist kein Fehler mehr, da
undefined
durch den Standardwert ersetzt wird. Aus Sicht des Aufrufers ist der Parameter jedoch weiterhin optional. Wenn Sie jetzt eine Deklarationsdatei generieren, spucken wir die Deklaration auswas einen Fehler verursacht. Und das ist ein Fehler.
Abgesehen davon würde ich vorschlagen, Destrukturierungsparameter in nicht implementierten Signaturen zu vermeiden. Sie sind wirklich ein Implementierungsdetail, dh ob die Funktionsimplementierung das Argument zerstört oder nur den Eigenschaftszugriff verwendet, sollte den Aufrufer nicht wirklich betreffen. Im Fall der Deklarationsdatei geben wir jedoch (widerwillig) das Destrukturierungsmuster aus, da wir keinen tatsächlichen Parameternamen zum Ausgeben haben, und müssen daher den Fehler beheben.