I have the following structure in my Node.js TypeScript project:
The important part here is the mongoModels. I have 2 models and they are connected as each Category model has field category.expertUserIds which contains array of user._id.
user.ts:
const { Schema, model } = require("mongoose");
const userSchema = new Schema({
username: {
type: String,
require: true,
},
password: {
type: String,
require: true,
},
});
module.exports = model("User", userSchema);
category.ts:
const { Schema, model } = require("mongoose");
const categorySchema = new Schema({
name: {
type: String,
require: true,
},
description: {
type: String,
},
expertUserIds: [
{
type: Schema.Types.ObjectId,
ref: "User",
},
],
});
module.exports = model("Category", categorySchema);
I have many project on exactly the same concept created as regular .js files but when I use TypeScript it is giving me this error:
mongoModels/category.ts:1:17 – error TS2451: Cannot redeclare
block-scoped variable ‘model’.1 const { Schema, model } = require("mongoose");
~~~~~
Same is for Schema and for both files. So basically it counts that I declared already:
const { Schema, model } = require("mongoose");
once and I cannot do it again for other file. How is that an error and how I can fix it as I am invoking Schema and model in different files?
2
Answers
Actually I found solution. It was to replace:
with:
I don't know why TS didn't worked with "require".
TypeScript basically runs on ESM(ECMAScript module) for Node. So you need to use
import
in place ofconst
andrequire
. TypeScript supports the EcmaScript module syntax which means you will be using modules in TypeScript usingimport
andexport
keywords which is very convenient.You can only import files ending with
.ts
and.d.ts
extensions (as well as.js
file). When you import these files using the import statement, they become modules.