Búsqueda de sitios web

herencia - TypeScript: El tipo de parámetro en el método heredado debería ser inferido


El compilador de TypeScript acepta el siguiente código sin señalar un error:

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

Siendo TypeScript un lenguaje de tipado estático, ¿no debería el compilador inferir el tipo del parámetro p en el método heredado f como number? ¿Por qué una asignación de un valor de cadena de tipo incorrecto queda sin ser detectada, produciendo un comportamiento extraño?

Respuesta #1

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

Este código es equivalente a este código:

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

Esto significa que puedes invocar C#f con cualquier tipo de argumento. Esta es una sustitución válida para tu clase porque es válido que un método derivado sea más general que su método base.

Se entiende que este comportamiento es un poco contraintuitivo, por lo que hay una función que acepta PRs para esto en el lenguaje para tipar automáticamente p como string en este caso.