Typescript: Nicht nullbare Typen spielen mit optionaler Destrukturierung (ng2) nicht gut.

Erstellt am 19. Mai 2016  ·  1Kommentar  ·  Quelle: microsoft/TypeScript

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
Bug

Hilfreichster Kommentar

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.

>Alle Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

manekinekko picture manekinekko  ·  3Kommentare

fwanicka picture fwanicka  ·  3Kommentare

wmaurer picture wmaurer  ·  3Kommentare

weswigham picture weswigham  ·  3Kommentare

Antony-Jones picture Antony-Jones  ·  3Kommentare