Ошибка компиляции TypeScript — Свойство не существует для type

#typescript

#typescript

Вопрос:

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

 src/Project/ProjectCollection.ts:6:13 - error TS2339: Property 'add' does not exist on type 'BaseCollection'.
  

Я приложил приведенный ниже код в качестве демо-версии:

ProjectCollection.ts Проектная коллекция.ts

 export default class ProjectCollection extends BaseCollection {
    addProject(project: Project) {
      super.add(project)
    }
}
  

BaseCollection.ts

 // @ts-ignore
import Collection from 'collectionsjs';

export default abstract class BaseCollection extends Collection {
    public all() {
        return super.all();
    }
}
  

Я использую следующую библиотеку на github для коллекций: (https://github.com/logaretm/collectionsjs)

Если я заменю строку из:

 import Collection from 'collectionsjs'
  

Для:

 const Collection = require('collectionsjs')
  

Затем вышеуказанная ошибка больше не возникает, но при запуске tslint (https://palantir.github.io/tslint /) Я получаю эту ошибку:

 ERROR: src/BaseCollection.ts:1:20 - require statement not part of an import statement
  

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

Спасибо

Ответ №1:

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

Первая проблема возникает из-за того, что collectionsjs модуль не имеет файла объявления TypeScript. В результате компилятор TypeScript не располагает никакой информацией об Collection типе. Несмотря на то, что во время выполнения Collection будет иметь определенный интерфейс, для компилятора Collection тип в некоторой степени1 эквивалентен этому:

 const Collection: any = {};
  

Способ решить проблемы — добавить объявление типа для collectionsjs модуля и создать тип, который описывает, что экспортирует этот пакет.

Вот начало этого файла объявления типа для вас:

collectionsjs.d.ts

 declare module 'collectionsjs' {
    export default class Collection {
        add(item);
        all();
    }
}
  

Чтобы завершить работу, добавьте каждый из открытых элементов Collection класса.


  1. Оно лишь «несколько» эквивалентно any типу, потому что, хотя мы можем extend Collection , мы не можем extend any ввести тип.

Комментарии:

1. Я вижу, это очень полезная особенность, которую нужно знать, я довольно новичок в typescript. Большое вам спасибо за вашу помощь с этим.

2. Пожалуйста. Поскольку вы ответили, я добавил начало файла объявления для вас.

3. Удивительно! Еще раз спасибо.