TypeScript-kompileringsfel - Egenskapen finns inte på typen
När jag försöker kompilera min TypeScript-kod dyker följande fel upp:
src/Project/ProjectCollection.ts:6:13 - error TS2339: Property 'add' does not exist on type 'BaseCollection'.
Jag har bifogat koden nedan som en demo:
ProjectCollection.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();
}
}
Jag använder följande bibliotek på GitHub för samlingar: (https://github.com/logaretm/collectionsjs)
Om jag byter raden från:
import Collection from 'collectionsjs'
till :
const Collection = require('collectionsjs')
Då uppstår inte ovanstående fel längre, men när jag kör tslint (https://palantir.github.io/tslint/) får jag detta fel:
ERROR: src/BaseCollection.ts:1:20 - require statement not part of an import statement
Undrar bara om någon kan förklara varför det första problemet med att använda import uppstår och hur båda dessa problem kan lösas samtidigt?
Tack
Svar #1
Undrar bara om någon kan förklara varför det första problemet med att använda import uppstår och hur båda dessa problem kan lösas samtidigt?
Det första problemet uppstår eftersom collectionsjs-modulen inte har någon TypeScript-deklarationsfil. Som ett resultat har inte TypeScript-kompilatorn någon information om Collection-typen. Även om Collection vid körning kommer att ha ett visst gränssnitt, är Collection-typen för kompilatorn på sätt och vis1 ekvivalent med detta:
const Collection: any = {};
Sättet att lösa problemen är att lägga till en typdeklaration för collectionsjs-modulen och att skapa en typ som beskriver vad det paketet exporterar.
Här är en start på den typen av deklarationsfil för dig:
collectionsjs.d.ts
declare module 'collectionsjs' {
export default class Collection {
add(item);
all();
}
}
För att slutföra jobbet, lägg till varje av de offentliga medlemmarna i Collection-klassen.
- Det är endast "delvis" motsvarande en
any-typ eftersom även om vi kanextendCollectionkan vi inteextendany-typen.
