Лучший способ решить ошибку typescript-свойство не существует на типе


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

"свойство x не существует в объекте типа (или массиве типов)"

Например, я использую typescript в Angular и имею определенную область действия, основанную на файле определения типа Angular:

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)

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

Спасибо

1 2

1 ответ:

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

interface ng.IScope {
    anotherProperty?:string;
}

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

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

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