TypeScript Cannot find namespace despite Variable being in same Class

I'm trying to define Callbackdefinitions to make it easier to work with many callbacks in my Node.js project.

My database.ts file looks like that:

export default class Database {

    //Export the enums
    public static LoadObjectResponse = LoadObjectResponse;

    //Export Callback definitions
    public static loadObjectCallback: (resultCode: Database.LoadObjectResponse) => void;//ERROR
    ...
}

enum LoadObjectResponse {
    ERROR_ON_LOADING, //"Error on Loading Object.",
    OBJECT_NOT_FOUND //"Object not found."
}

So I want a loadObjectCallback defined, that says that the parameter has to be of the enum Type LoadObjectResponse. But when I try to do it like that, the compiler always gives the error

Cannot find namespace "Database"

I don't understand why it gives me the error, the variable itself is in the definition of Database, why doesn't it work?

It gives me the same error when I try to use it in Classfunction definitions:

public static loadObject(MongoModel, searchObject, callback: Database.LoadObjectResponse) {//ERROR namespace Database not found

Again Error:

Cannot find namespace "Database"

Inside of functions in the Database class calling

Database.LoadObjectResponse

works flawlessly, why doesn't it work in variable definitions?


Solution 1:

Cannot find namespace "Database"

This is a common learning curve issue. You need to understand and be comfortable with the intutive concept of declaration spaces : https://basarat.gitbook.io/typescript/project/declarationspaces

Things are distinct in the type declaration space or in the variable declaration space.

In your case public static LoadObjectResponse is a variable hence cannot be used as a type (error on annotation usage : Database.LoadObjectResponse).

Fix

Please don't treat a class as a namespace. The file is a module.

export class Database {
    //Export Callback definitions
    public static loadObjectCallback: (resultCode: LoadObjectResponse) => void;//ERROR
}

export enum LoadObjectResponse {
    ERROR_ON_LOADING, //"Error on Loading Object.",
    OBJECT_NOT_FOUND //"Object not found."
}

Also beware of export default : https://basarat.gitbook.io/typescript/main-1/defaultisbad

Solution 2:

It's because Database.LoadObjectResponse is a property and not a type. You can't use properties as types.

To make this work, change it to use the type of the property:

static loadObjectCallback: (resultCode: typeof Database.LoadObjectResponse) => void;

Or refer directly to the enum type of LoadObjectResponse:

static loadObjectCallback: (resultCode: LoadObjectResponse) => void