2016-04-09 1 views
2

Le compilateur dactylographiée accepte le code suivant sans signaler une erreur:tapuscrit: Type de paramètre dans la méthode héritée doit être déduit

class S { 
    f(p: number) { 
     console.log(`${p + 1}`); 
    } 
} 

class C extends S { 
    f(p) { 
     super.f(p) 
    } 
} 

let a: C = new C(); 
let b: C = new C(); 

a.f(41); // -> 42 
b.f('x'); // -> x1 

tapuscrit étant un langage typé statiquement, ne doit pas le compilateur déduire le type de paramètre de p dans la méthode héritée f à number? Pourquoi une attribution de la valeur de chaîne typée incorrecte est-elle laissée non prise, produisant un comportement étrange?

Répondre

2
class C extends S { 
    f(p) { 
     super.f(p) 
    } 
} 

Ce code est équivalent à ce code:

class C extends S { 
    f(p: any) { // <---- parameter is 'any' 
     super.f(p) 
    } 
} 

Cela signifie que vous pouvez appeler C#f avec tout type d'argument. C'est une substitution valide pour votre classe à faire car il est valide d'avoir une méthode dérivée soit plus général que sa méthode de base.

Ce comportement est considéré comme un peu contre-intuitif, donc there's a feature accepting PRs for this in the language pour taper automatiquement p comme string dans ce cas.

+1

Merci, Ryan, Je suis d'accord que la substitution est valide avec un paramètre plus général. Bien que, à mon humble avis, l'appel 'super.f (p)' ne devrait pas être autorisé avec un argument d'un type indéfini (_any_). Existe-t-il un moyen d'imposer une telle vérification de type par le compilateur? –