Типы союзов не применяются?

Разве это не должно потерпеть неудачу?

class Animal { }
class Person { }

type MyUnion = Number | Person;

var list: Array<MyUnion> = [ "aaa", 2, new Animal() ]; // Shouldn't this fail?

var x: MyUnion = "jjj"; // Shouldn't this fail?

Есть ли способ принудительно проверить тип в этом случае?


person KarolDepka    schedule 05.01.2017    source источник


Ответы (2)


TypeScript обрабатывает совместимость типов на основе structural subtyping.

Структурная типизация — это способ связывания типов, основанный исключительно на их членах.

В частности, для занятий:

При сравнении двух объектов типа класса сравниваются только члены экземпляра. Статические члены и конструкторы не влияют на совместимость.

Дополнительные сведения см. на странице https://www.typescriptlang.org/docs/handbook/type-compatibility.html#classes

person shusson    schedule 05.01.2017
comment
Спасибо. Проголосовал. Можно ли назвать это утиной печатью? - person KarolDepka; 05.01.2017
comment
Да, я думаю, вы могли бы назвать это так, Typescript официально называет его structural subtyping. В Википедии есть хорошее объяснение утиной печати и машинописного текста en.wikipedia.org/wiki/Duck_typing#In_Typescript< /а> - person shusson; 05.01.2017

Это не удастся, если Animal или Person что-нибудь определят:

class Animal { name: string; }
class Person { age: Number; }

type MyUnion = Number | Person;

var list: Array<MyUnion> = [ "aaa", 2, new Animal() ]; // Fails now

var x: MyUnion = "jjj"; // Fails now

Поскольку вы ничего не определили в Animal или Person, строка (или вообще что-то еще) выполняет контракт, о котором вы просите.

person Rob    schedule 05.01.2017
comment
Спасибо. Проголосовал. Рассматривает ли он животное/человека как вид любого типа? - person KarolDepka; 05.01.2017
comment
Наполовину связанный: typescriptlang.org/play показывает подсказки об ошибках, но по-прежнему выполняет написанный вами код. Любой способ заставить его предотвратить запуск при ошибках? - person KarolDepka; 05.01.2017
comment
@KarolDepka Я не уверен во внутренних компонентах, является ли это «любым», однако в контракте просто говорится, что я хочу, чтобы объект содержал следующие члены: {}. Поскольку мы не просим присутствия каких-либо членов, любой тип может выполнить этот запрос. - person Rob; 05.01.2017
comment
@KarolDepka Я почти уверен, что компилятор применяет эту ошибку по умолчанию, однако я не уверен насчет этого конкретного игрового сайта. - person Rob; 05.01.2017