Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   TypeScript: непонятна реализация interface (https://javascript.ru/forum/misc/63619-typescript-neponyatna-realizaciya-interface.html)

Pit 18.06.2016 18:02

TypeScript: непонятна реализация interface
 
Приветствую, камрады!
Имеем TS 1.8

Пишу так:

var v: Object;
v = {name1: 'val1'}


Все хорошо компилируется. Вроде как Object совместим с любым объектом.
Пишу вот так:

interface MyInterface {
    name2: string;
}

var v: MyInterface;
v = {name1: 'val1'}  // <--- РУГАЕТСЯ


И он ругается: Error:(138, 55) TS2322: Type '{ name1: "val1"}' is not assignable to type 'MyInterface '.
Object literal may only specify known properties, and 'name1' does not exist in type 'MyInterface '.

НО! Если только "known properties", то почему не ругаетс на первый вариант с Object? Ведь в lib.d.ts Object также определен как Interface:

> interface Object {...

И, естественно, никакого name1 там также не описано...
Ничего не понимаю!

aklis 18.06.2016 21:34

Это же форум экмаскрипт, а не тайпскрипт. Врядли тут много знатоков

Pit 18.06.2016 22:31

Цитата:

Сообщение от aklis (Сообщение 419866)
Это же форум экмаскрипт, а не тайпскрипт. Врядли тут много знатоков

ну а шо делать шо делать :)

yazonnile 19.06.2016 00:19

Все верно ругается.
http://stackoverflow.com/questions/3...own-properties

Pit 19.06.2016 12:57

Цитата:

Сообщение от yazonnile (Сообщение 419873)
Все верно ругается.
http://stackoverflow.com/questions/3...own-properties

спасибо большое! Но там объяснено как это победить - надо в интерфейс добавить:
[others: string]: any;

Тогда начнет "принимать" и другие свойства.

Но непонятно - почему не ругается на Object? Он же объявлен как интерфейс и там подобной строки нету. А принимает что угодно...

Pit 19.06.2016 13:06

Разобрался: https://github.com/Microsoft/TypeScr...ess-properties

Цитата:

A property P is said to be expected in a type T if one of the following is true:

T is not an object, union, or intersection type.
T is an object type and
T has a property with the same name as P,
T has a string or numeric index signature,
T has no properties, or
T is the global type 'Object'.
T is a union or intersection type and P is expected in at least one of the constituent types of T.
Тип Object является исключением выделенным.


Часовой пояс GMT +3, время: 20:52.