2016-09-30 2 views
2

У меня есть несколько различных ситуаций, в которых я пытаюсь определить самодельной свойство на массив или объект в машинописи, но обычно получаю ошибку:Лучший способ решить ошибку машинопись - свойство не существует на типе

«Недвижимость х не существует на тип объект (или типа Array)»

Например я использую машинопись в угловом и имею определенную сферу на основе файл углового определения типа:

scope:ng.IScope 

Но тогда, когда я пытаюсь для создания нового свойства по области:

scope.anotherProperty = "string"; 

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

scope["anotherProperty"] = "string"; 

ИЛИ

(<any>scope).anotherProperty = "string; 

Другой пример, когда у меня есть что-то вроде этого в моем графике d3:

function panZoomNode (node:any) { 
      for (var i = 0; i < renderedNodes.length; i++) { 
       if (node.id === renderedNodes[i].id) { 

        } 
       } 
     } 

В идеале , Я хотел бы изменить этот параметр (node: any) на что-то вроде:

(node:Object) 

Но когда я это делаю, я получаю сообщение об ошибке «Идентификатор свойства не существует в объекте типа». Я знаю, что могу исправить это с помощью решений, упомянутых выше, но для меня это кажется неаккуратным. Есть ли лучший способ или лучший тип машинописного текста, позволяющий им правильно запускать как массивы, так и объекты?

Благодаря

+2

Можете ли вы наследовать от ng.IScope, добавить другое свойство в определение и его использование? Последняя проблема вызвана тем, что объект не имеет свойства id. Либо вы оставите его свободно, либо создайте класс/интерфейс. –

+0

Да, я должен унаследовать от этого, что лучше всего подходит для добавления определения? Тогда это позволит мне сделать что-то вроде «scope.anotherProperty = string». Кроме того, если бы я собирался добавить интерфейс, я бы хотел просто установить все свойства, которые мог бы иметь объект-узел, или если я просто использую id, лучше всего добавить id? а затем вызовите это в определении параметра.Спасибо – bschmitty

+1

Я добавил ответ ниже. Вместо того, чтобы наследовать от ng.IScope, вы можете просто расширить его. –

ответ

1

Вы можете добавить дополнительное свойство к интерфейсу ng.IScope, добавив следующую строку в ваш код:

interface ng.IScope { 
    anotherProperty?:string; 
} 

Это позволит вам позвонить

scope.anotherProperty = "string"; 

, не видя остальной части вашего кода и зная, что действительно представляет node Я могу только сказать, что для того, чтобы сделать компилятор счастливым, вам нужно просто включить членов, на которые вы ссылаетесь в коде TS. Если вы делаете это правильно, создайте класс, содержащий все члены. Если он происходит из существующего класса или реализует существующий интерфейс, вы должны наследовать от тех, которые указаны в определении вашего класса.

Редактировать: Если вы еще этого не сделали, вы должны посмотреть репозиторий DefinitelyTyped GitHub для определения D3. Предполагая, что node является типом D3, вы можете использовать его для решения своей проблемы и не писать собственный класс.

+0

У меня получилось просто расширить ng.IScope и добавить дополнительные свойства, которые мне нужны для доступа. Это прекрасно работает. Мой редактор не любил просто использовать интерфейс, как вы описали в своем ответе. Для узла я посмотрел на тип D3 типа defs, но в моем случае ничего не работает для узла, поскольку я использую dagre-d3, а также со специальными свойствами. Я просто создал интерфейс и добавил необходимые мне свойства, которые работали на меня. благодаря – bschmitty

Смежные вопросы