javascript - kan ikke kræve standardeksporteret funktion fra typescript-fil i nodejs
Jeg prøver at bygge en npm-pakke i typescript. Jeg kan ikke kræve og bruge den standardfunktion, der eksporteres i typescript-modulet. Jeg har prøvet at ændre modulindstillingerne i tsconfig.json til UMD og AMD, men uden held.
//index.ts
export default function () {
console.log("greet");
}
export function greet2() {
console.log("greet2");
}
//tsconfig.json
{
"compilerOptions": {
"target": "es5",
"module": "commonJS",
"declaration": true,
"outDir": "./lib",
"strict": true
}
}
//index.js
const greet = require("./lib/index");
greet();
greet.greet2();
//console
greet();
^
TypeError: greet is not a function
Webpack kan bruges til løsningen, men jeg vil gerne vide, om der er en måde, jeg kan gøre det på uden at bruge Webpack.
Svar #1
Problemet er, at du blander modulsyntaks. Når du bruger require, får du tilbage et objekt med en default-egenskab og en greet2-egenskab.
require antager, at du ved, hvordan dine exports er struktureret, fordi de kan være i næsten enhver form, du har specificeret med module.exports=anything. ES-moduler derimod har en streng specifikation. Dette gør det muligt for en import at antage formen af det, der kommer fra et export, og gøre ting som praktisk at dekonstruere det for dig.
I øjeblikket, hvis du logger det, vil greet-variablen være et objekt som følger:
Object {default: function _default(), greet2: function greet2()}
Dette er selvfølgelig ikke en funktion og dermed fejlen.
Hvis du i stedet bruger import-syntaks
import greet from './lib/index';
det vil blive kompilere til noget tilsvarende:
const greet = require('./lib/index').default;
Du er naturligvis i stand til at bruge require selv på denne måde, du skal blot være opmærksom på formen af det, der returneres fra require, og destructure det tilsvarende.
