Je récupère des données à partir d'une URL et si une certaine condition est remplie, les données sont chargées dans un type B ou sa superclasse A. Lorsque les données sont chargées dans B, le script dactylographié ne reconnaît pas ses propriétés. J'obtiens l'erreur suivante avec le code ci-dessous :

La propriété 'doB' n'existe pas sur le type 'A'

class A {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    doA() {
        return "Hello, " + this.greeting;
    }
}
class B  extends A{
    greeting: string;
    constructor(message: string) {
        super(message)
        this.greeting = message;
    }
    doB() {
        return "Hello, " + this.greeting;
    }
}

let greeter: A|B  = new B("world");
greeter.doB()
1
TSR 14 mars 2019 à 20:32

2 réponses

Meilleure réponse

L'erreur a du sens. Comment pouvez-vous appeler doB avec certitude si le type défini pour la var greeter est A ou B (et A ne le membre doB() est-il défini) ?

l'accueil est de type A ou B, je suppose. Alors pourquoi tapuscrit ne me permet pas d'appeler une méthode de B ?

Parce que greeter pourrait également être une instance de A qui briserait la sécurité de type si le transpileur le permettait.

Avoir un type de A | B vous permet uniquement d'accéder aux propriétés qui existent sur les deux.

2
TSR 14 mars 2019 à 17:41

Lorsque vous définissez un type comme A|B, il s'agit d'un Type d'union dans TypeScript.

Lors de l'utilisation d'un type d'union, le script dactylographié par défaut ne vous permettrait d'utiliser que les propriétés présentes sur les deux types. Dans ce cas, un exemple serait doA.

Mais si nous ne pouvons accéder qu'à ceux-ci, alors le type n'aura pas beaucoup de sens. Pour accéder à une propriété qui n'est présente que sur une des instances, tout ce que vous avez à faire est de vous assurer qu'elle a le bon type d'instance ou Type Gaurd. Dans ce cas, cela peut être fait avec:

let greeter: A|B  = new B("world");
if(greeter instanceof B) {
    // Do just B things
} else if(greeter instanceof A) {
   // Do only A things
}
3
Agney 14 mars 2019 à 17:49