在Typescript中导入Java对象

bxfogqkk  于 2023-04-22  发布在  TypeScript
关注(0)|答案(2)|浏览(183)

我需要知道是否可以在Typescript脚本中导入Java对象(具体地说,是枚举类)。
我谷歌了一下,但什么也没找到。
ErrorCodeAuthority是为了让我们的服务为每个已知错误抛出自定义的标准化错误,并在一个地方定义设置消息(一些参数化,一些没有),http状态码等。
在我们的javascript代码中

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

是否可以在Typescript中做同样的事情?
我声明了以下内容:

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");

我尝试使用新类型如下:

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

当我尝试使用grunt编译成js时,我得到了以下错误:

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

(For引用,super HttpResult是一个包含numberhttp code and a字符串body. HttpStatus, in the Java enum, is of type org.springframework. http.HttpStatus 的对象)。 我尝试删除export function type(arg: "com.domain.ErrorCodeAuthority"): ErrorCodeAuthority;`行,但这并没有改变异常。
我们在一个nashorn容器中运行所有这些,如果这有区别的话

dldeef67

dldeef671#

是否可以在Typescript中做同样的事情?
是的。使用1c,您可以直接写入

let JavaErrorCodeAuthority = com.domain.ErrorCodeAuthority

而且每一级包都有自动完成功能。

bqf10yzr

bqf10yzr2#

是的,如果你已经在JavaScript中这样做了,你可以通过为它创建一个定义文件并将其移植到TypeScript来使用代码。一个例子可能是这样的:

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

枚举和第一个类型函数“com.domain.ErrorCodeAuthority”是可选的,但当传入特定字符串时,它会为您提供更好的typeinfo。请注意,declare模块部分不会生成任何代码,您可以将其添加到.ts.d.ts文件中。有关创建定义文件的更多信息可以在这里找到:https://github.com/Microsoft/TypeScript/wiki/Writing%20Definition%20Files

编辑

在从评论中获得信息后,我希望下面的代码能更好地满足您的需要。这有一个缺点,即它不能在switch语句中使用,但在这种情况下,我认为最好将java枚举视为模块(或者类是可能的)。这可能不是100%正确的建模,但希望它能给你一些额外的想法。只是一个小的侧记,我觉得你的情况非常有趣和具有挑战性!

declare module Java {
    interface ErrorCodeValue {
       toString(): string;
       value(): number;
    }
    module ErrorCodeAuthority {
        var ENTITY_NOT_FOUND: IErrorCodeAuthority;
        var HTTP_VERB_NOT_SUPPORTED: IErrorCodeAuthority;
        var BAD_REQUEST: IErrorCodeAuthority;
    } 
    interface IErrorCodeAuthority {
        httpStatus: ErrorCodeValue;
    }
    export function type(arg: "com.domain.ErrorCodeAuthority"): typeof ErrorCodeAuthority;
    export function type(arg: string): any;
}
export class HttpResult {
    constructor(code: number, description: string) {        
    }
}
export class HttpFailResult extends HttpResult {
    constructor(public errorCode: Java.IErrorCodeAuthority, public userParams? :any[]) {
        super(errorCode.httpStatus.value(), errorCode.toString());
    }
}
var JavaErrorCodeAuthority = Java.type("com.domain.ErrorCodeAuthority");
new HttpFailResult(JavaErrorCodeAuthority.BAD_REQUEST, null);

相关问题