#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
класса.
- Оно лишь «несколько» эквивалентно
any
типу, потому что, хотя мы можемextend
Collection
, мы не можемextend
any
ввести тип.
Комментарии:
1. Я вижу, это очень полезная особенность, которую нужно знать, я довольно новичок в typescript. Большое вам спасибо за вашу помощь с этим.
2. Пожалуйста. Поскольку вы ответили, я добавил начало файла объявления для вас.
3. Удивительно! Еще раз спасибо.