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')
})

Relaterade artiklar