2016-09-16 4 views
2

Я новичок в TypeScript. У меня была небольшая проблема при доступе к данным Object.Ошибка TypeScript при доступе к объекту литерала объекта

let content:Array<string> = ["I", "am", "a", "beginner"] 
let data:Object = {a: "foo", b: content} 
console.log(data.a); 
console.log(data['b']); 
console.log(data.b); 

Этот код будет иметь ошибку в строке 5. (нет ошибок в JavaScript) Пожалуйста, объясните мне. Спасибо за любую помощь.

+0

Вы можете принять ответ (через зеленый галочкой) в 15 мин прошло – DAXaholic

+0

Как я могу принять ваш ответ? (извините, я новичок) –

+0

Нет причин жалеть - см. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – DAXaholic

ответ

2

Просто удалите явное объявление data, чтобы быть Object так, что машинопись будет определить тип, то есть изменить его на что-то вроде этого

let content:Array<string> = ["I", "am", "a", "beginner"] 
let data = {a: "foo", b: content} 
console.log(data.a); 
console.log(data['b']); 
console.log(data.b); 

причины вашей ошибки в вашем исходном коде, потому что вы сообщая компилятору TypeScript, что data имеет тип Object или любой производный класс, из которого: поскольку тип Object не имеет свойств a или b, это приводит к ошибке.

Пожалуйста, обратите внимание, что удаление явной аннотации типа не то же самое, как с помощью any как предложено AD.Net как в этом случае машинописи до сих пор имеет всю информацию о типе доступной - просто выведенной (см скриншота Visual Studio кодекса), в то время как на используя any, вы сообщаете компилятору TypeScript, что переменная может ссылаться на все, что не приводит к проверке типа.

enter image description here

+0

Большое вам спасибо за помощь. Я понял об этом. :) –

+0

Вы можете упомянуть, что причина, по которой начинается первоначальное назначение, заключается в том, что TS игнорирует ** дополнительные ** свойства. –

+0

#DAXaholic конечно, я буду голосовать за ваш ответ, если смогу. –

0

Вы можете назначить data:any, по крайней мере, вы не получите никакой ошибки. Если вы хотите intellisense, вам нужно создать type/interface для data, например.

interface myData{ 
    a:string; 
    b:Array<String> 
} 
data:myData 

то у вас может быть intellisense.

+0

Спасибо за помощь. Интерфейс работает отлично. –