Typescript utökar och implementerar att använda tillsammans när det i flera filer bryts
När denna kod körs i en fil kompilerar den utan problem:
export interface Describe {
describe: () => string
}
export class Base {
constructor (readonly cat: string) {}
}
export class Child extends Base implements Describe {
constructor (readonly name: string) {
super ('Standard')
}
describe () {
return `${this.cat}: ${this.name}`
}
}
Men när alla delar är i separata filer (Describe.ts, Base.ts innehåller endast koden för de klasserna, och Child.ts är så här:
import {Base} from './Base'
import {Describe} from './Describe'
export class Child extends Base implements Describe {
constructor (readonly name: string) {
super ('Standard')
}
describe () {
return `${this.cat}: ${this.name}`
}
}
Även om TypeScript inte klagar (typningar är giltiga) så går koden sönder när man kör test med jest. Fick följande fel:
Base_1.Child är inte en konstruktor
Jag misstänker att importordningen är fel, men jag kan inte se felet?
I ett mer komplext exempel med ett liknande mönster (en klass som utökar en annan och implementerar gränssnitt) bröts det också med följande felmeddelande
TypeError: Klass som utökar värdet undefined är inte en konstruktor eller null
medan när all kod är i en fil så fungerar det bara?
Här är tsconfig.json jag använder:
{
"compilerOptions": {
"module": "esnext",
"target": "esnext",
"moduleResolution": "node",
"outDir": "lib",
"declaration": true,
"strict": true,
"noUnusedLocals": true,
"esModuleInterop": true,
"noImplicitReturns": false,
"noUnusedParameters": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"forceConsistentCasingInFileNames": true
},
"include": ["src"]
}
Här är den relevanta delen av package.json (eftersom det kraschar med jest):
{
"scripts": {
"build": "rimraf ./lib && tsc",
"test": "jest --watch",
"test:all": "jest --watchAll",
"test:coverage": "jest --coverage"
},
"jest": {
"preset": "ts-jest",
"testEnvironment": "jsdom",
"roots": [
"<rootDir>/src"
],
"coveragePathIgnorePatterns": [
"/node_modules/"
],
"coverageThreshold": {
"global": {
"lines": 95,
"branches": 90,
"functions": 95,
"statements": 95
}
}
},
"dependencies": {
"pretty-format": "^24.8.0"
},
"devDependencies": {
"@types/jest": "^24.0.18",
"@types/node": "^12.7.11",
"@types/pretty-format": "^24.3.0",
"@typescript-eslint/eslint-plugin": "^2.3.3",
"@typescript-eslint/parser": "^2.3.3",
"eslint": "^6.5.1",
"jest": "^24.9.0",
"rimraf": "^3.0.0",
"ts-jest": "^24.1.0",
"ts-node": "^8.4.1",
"typescript": "^3.6.3"
}
}
Testet som kraschar med jest:
import {Child} from './Child'
it ('A suite', () => {
expect (new Child ('an item').describe ()).toBe ('Standard: an item')
})