18
votes

When I use this line on my Express server, it works well in TypeScript 1.x

mongoose.Promise = global.Promise;

( The usage of mongoose.Promise = global.Promise; is from the mongoose document )

After updating to TypeScript 2.x, it shows this error in the terminal, and won't let me start the server.

Left-hand side of assignment expression cannot be a constant or a read-only property.

How can I solve this? Thanks

2

2 Answers

36
votes

This is because in es6 all module's variables are considered constants.

https://github.com/Microsoft/TypeScript/issues/6751#issuecomment-177114001

In TypeScript 2.0 the bug (of not reporting this error) was fixed.

Since mongoose is still using the commonjs - var mongoose = require("mongoose") - not the es6 import syntax (which is used in the typings), you can suppress the error by assuming the module is of type any.

WORKAROUND:

(mongoose as any).Promise = global.Promise;
2
votes

There is also a way to maintain type-checking and intellisense with this technique.

import * as mongoose from "mongoose"; // same as const mongoose = require("mongoose");
type mongooseType = typeof mongoose;
(mongoose as mongooseType).Promise = global.Promise;
// OR
(<mongooseType>mongoose).Promise = global.Promise;

This can be a helpful way to override only certain functions within a module with mock functions without needing a mock framework like jest.mock().