TypeScript prend en charge les paramètres de chaîne de surcharge afin que les méthodes renvoyant any
puissent être correctement typées lorsqu'elles sont appelées avec certains arguments.Pourquoi doit-il y avoir une déclaration de type générale avant l'implémentation lors de la surcharge des paramètres de chaîne?
Ceci est défini dans la spécification en deux endroits: https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#1.8 https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3.9.2.4
Cependant, ceux-ci se fonctionnent correctement peut être difficile. Voici une classe d'exemple qui a un get
générique. Je souhaite fournir des types spécifiques lorsque vous transmettez les chaînes "a"
ou "b"
à cette fonction et, dans tous les autres cas, que le type de retour soit any
.
J'inclus les deux signatures spécialisées, puis fournissez une signature générale, puis fournissez l'implémentation, qui a la signature générale. Le code suivant signale correctement l'erreur pour les deux premières affectations à x
et y
, mais si je supprime la signature générale (get(name: string): any
), j'obtiens l'erreur: Argument of type '"c"' is not assignable to parameter of type '"b"'.
Pourquoi la signature générale nécessite-t-elle en plus de la signature sur l'implémentation?
export default class Example {
contents: any
get(name: "a"): number
get(name: "b"): string
// Why is this required???
get(name: string): any
get(name: string): any { return this.contents[name] }
}
let w = new Example()
// Expected errors
// Type 'number' is not assignable to type 'string'.
let x: string = w.get("a")
// Type 'string' is not assignable to type 'number'.
let y: number = w.get("b")
// I get an error here only if I remove the general signature before the
// implementation of get.
// Argument of type '"c"' is not assignable to parameter of type '"b"'.
let z: string[] = w.get("c")