Search code examples
javajavascripttypescriptnashorn

Nashorn: Import Java object in Typescript


I need to know if it's possible to import a Java object (specifically, an enum class) in a Typescript script.

I've googled but haven't found anything.

The ErrorCodeAuthority is for having custom, standardized errors thrown from our service for each known error with set messages (some parameterized, some not), http status codes, etc defined in one place.

In our javascript code we have

var JavaErrorCodeAuthority = Java.type("com.domain.ErrorCodeAuthority");

Is it possible to do the same in Typescript?

I've declared the following:

declare module Java {
    export enum ErrorCodeAuthority {
        ENTITY_NOT_FOUND,
        HTTP_VERB_NOT_SUPPORTED,
        BAD_REQUEST,
        //...
    }
    export function type(arg: "com.domain.ErrorCodeAuthority"): ErrorCodeAuthority;
    export function type(arg: string): any;
}
var JavaErrorCodeAuthority = Java.type("com.domain.ErrorCodeAuthority");

and I'm attempting to use the new type as follows:

export class HttpFailResult extends HttpResult {
    constructor(public errorCode : Java.ErrorCodeAuthority, public userParams? : UserParam[]) {
        super(errorCode.httpStatus.value(), errorCode.toString());
    }
}

I'm getting the following error when I try to use grunt to compile to js:

error TS2339: Property 'httpStatus' does not exist on type 'ErrorCodeAuthority'.

(For reference, the super HttpResult is an object that contains a number http code and a stringbody. HttpStatus, in the Java enum, is of typeorg.springframework.http.HttpStatus`).

I tried removing the export function type(arg: "com.domain.ErrorCodeAuthority"): ErrorCodeAuthority; line but that didn't change the exception.

We're running all of this inside a nashorn container if that makes a difference


Solution

  • Is it possible to do the same in Typescript?

    Yes. With tyrian, you can just write

    let JavaErrorCodeAuthority = com.domain.ErrorCodeAuthority
    

    And there will be auto-completion on each level of packages.