Roly Roly - 2 months ago 27
TypeScript Question

TypeScript: why is a number assignable to a reference of type Object?

Why is this legal TypeScript?

var x: number = 5
var y: Object = x


Surely a number is not an
Object
. One might suspect that x is implicitly coerced (auto-boxed) to an object, but no:

if (!(y instanceof Object)) {
console.log(typeof y)
}


prints

number


For the record:

$ tsc --version
Version 1.8.10

Answer

Type compatibility in TypeScript is based on structural subtyping, not nominal typing. That said, consider the two following interface definitions:

interface IFoo { X: number }
interface IBar { X: number; Y: number }

Does IBar extend IFoo? No.

But is IFoo compatible with IBar? Yes.

The members of IFoo are a subset of IBar members, thus you can assign any IBar to IFoo. But it doesn't work the other way around:

var x: IFoo;
var y: IBar;

x = y // all good
y = x // type error, x has no Y member

This way in Typescript all types are compatible with Object if you think of it as the empty interface. This way you can pass any valid typescript value to functions accepting Object and play well with the way Javascript libs are written.

I suggest reading Type Compatibility in docs and the last paragraph about Subtype vs Assignment.