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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…