Version TypeScript:
tous les soirs (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;
}
Comportement prévisible:
Lors de la compilation avec des vérifications nulles strictes, je m'attendrais à ce que cela compile, car les variables déstructurées ont été marquées comme facultatives, car cela fonctionne:
export interface QueryMetadataFactory {
(selector: Type | string, whatever?: {
descendants?: boolean;
read?: any;
}): ParameterDecorator;
new (selector: Type | string, whatever?: {
descendants?: boolean;
read?: any;
}): QueryMetadata;
}
Comportement réel:
Lors de la compilation:
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
Celui-ci est à la limite. La fonction
function foo({ a, b }?: { a: number, b: number }) {
}
est en fait une erreur car l'argument que vous essayez de déstructurer pourrait être undefined
. Donc, implémenter la signature exacte que vous avez dans votre exemple ne serait pas possible. Maintenant, si vous changez la déclaration en
function foo({ a, b }: { a: number, b: number } = { a: 0, b: 0 }) {
}
ce n'est plus une erreur car undefined
serait remplacé par la valeur par défaut. Pourtant, du point de vue des appelants, le paramètre est toujours facultatif et si vous générez maintenant un fichier de déclaration, nous crachons la déclaration
declare function foo({ a, b }?: { a: number, b: number }): void;
ce qui provoque une erreur. Et _that_ est un bug.
En passant, je suggérerais d'éviter la déstructuration des paramètres dans les signatures de non-implémentation. Ils sont vraiment un détail d'implémentation, c'est-à-dire si l'implémentation de la fonction déstructure l'argument ou utilise simplement l'accès aux propriétés ne devrait pas vraiment concerner l'appelant. Cependant, dans le cas du fichier de déclaration, comme nous n'avons pas de nom de paramètre réel à émettre, nous émettons (à contrecœur) le modèle de déstructuration et nous devons donc corriger le bogue.
Commentaire le plus utile
Celui-ci est à la limite. La fonction
est en fait une erreur car l'argument que vous essayez de déstructurer pourrait être
undefined
. Donc, implémenter la signature exacte que vous avez dans votre exemple ne serait pas possible. Maintenant, si vous changez la déclaration ence n'est plus une erreur car
undefined
serait remplacé par la valeur par défaut. Pourtant, du point de vue des appelants, le paramètre est toujours facultatif et si vous générez maintenant un fichier de déclaration, nous crachons la déclarationce qui provoque une erreur. Et _that_ est un bug.
En passant, je suggérerais d'éviter la déstructuration des paramètres dans les signatures de non-implémentation. Ils sont vraiment un détail d'implémentation, c'est-à-dire si l'implémentation de la fonction déstructure l'argument ou utilise simplement l'accès aux propriétés ne devrait pas vraiment concerner l'appelant. Cependant, dans le cas du fichier de déclaration, comme nous n'avons pas de nom de paramètre réel à émettre, nous émettons (à contrecœur) le modèle de déstructuration et nous devons donc corriger le bogue.