2016-09-18 15 views
6

Почему этот законный TypeScript?TypeScript: почему число присваивается ссылке типа Object?

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

Несомненно, номер не является Object. Не Можно подозревать, что х неявно принуждать (авто-коробочный) к объекту, но нет:

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

печатает

number 

Для записи:

$ tsc --version 
Version 1.8.10 

ответ

6

совместимости типа в машинописном основано на структурном подтипировании, а не на типичном типе. Тем не менее, рассмотрим два следующих определения интерфейса:

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

ли IBar расширяющие IFoo? No.

Но является IFoo совместимым с IBar? Да.

Члены IFoo являются подмножеством IBar членов, таким образом, вы можете назначить любой IBar к IFoo. Но это не работает наоборот:

var x: IFoo; 
var y: IBar; 

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

Таким образом, в машинописном все типы совместимы с Object, если вы думаете о нем, как пустой интерфейс. Таким образом, вы можете передать любое действительное значение машинописного текста для функций, принимающих Object, и хорошо сыграть с тем, как написаны Javascript libs.

Предлагаю прочитать Type Compatibility в документах и ​​последнем абзаце о Подтип против задания.

+1

Хорошо, это по существу объяснение, которое я ожидал (заметив, что я также могу назначить bool пустующему интерфейсу, который я определил как Bool, который изоморфен Object). Я понимаю структурный и номинальный, но не ожидал, что он применим к типам без ссылки. Я думаю, это звучит только в той степени, в которой Object действительно имеет пустой интерфейс (учитывая, что, вероятно, есть вещи, которые я могу сделать для объекта, который я не могу сделать с номером или примитивной строкой). – Roly

+0

Я доволен объяснением, поэтому я принял ответ. Оказывается, меня укусили не потому, что число Roly

+1

Я предполагаю, что здесь есть смысл, в котором число <Объект необоснованно: он разбивает восходящее закрытие экземпляра. Другими словами, X Roly