colinfang colinfang - 24 days ago 4
TypeScript Question

Why doesn't interface protect me in this case?

interface IA {
readonly a: string;
f(x: string): void;
}

class X implements IA {
a;
f(x) {
this.a = 1;
}
}

let x = new X().a;


Surprisingly, this code compiles.


  • It infers the type of
    X.a
    as
    any
    , why is that?

  • readonly
    doesn't seem to protect me from modifying a. Am I using it wrong?



Update



https://github.com/Microsoft/TypeScript/issues/11578

Answer

Pretty much down to any non-typed variable implicitly being any. You can disable that in the compiler options:

  "noImplicitAny": true

at which point you will have to define a type that can be assigned to the base-interface type.

enter image description here

as for the read-only. its working as intended:

enter image description here

you have to understand there are some differences between typescript and other OO languages like C#. Namely that the assignment of one typed variable to another is all about whether the right-side type intersects with the left-side type. i.e.

let x: X = { a: "hello", f: (x) => { } };

is perfectly valid.