在Typescript中导入Java对象

时间:2014-12-15 20:16:09

标签: java javascript typescript nashorn

对于downvoters来说 - 这是一个合理的问题。在假设我混淆了我的语言之前,请花时间检查它,就像某种编程新手一样!

我需要知道是否可以在Typescript脚本中导入Java对象(特别是枚举类)。

我用谷歌搜索但没有找到任何东西。

ErrorCodeAuthority用于针对每个已知错误从我们的服务中抛出自定义的标准化错误,其中包含在一个地方定义的设置消息(某些参数化,某些参数化,某些不是),http状态代码等。

在我们的javascript代码中,我们有

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

是否可以在打字稿中做同样的事情?

根据以下答案进行修改

我已宣布以下内容:

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'.

(作为参考,超级HttpResult是一个包含number http code and a字符串body. HttpStatus, in the Java enum, is of type org.springframework.http.HttpStatus`的对象。

我尝试删除export function type(arg: "com.domain.ErrorCodeAuthority"): ErrorCodeAuthority;行,但这并没有改变异常。

编辑2 如果这会产生影响,我们将在nashorn容器中运行所有这些

2 个答案:

答案 0 :(得分:2)

  

是否可以在打字稿中做同样的事情?

是。使用1c,您只需编写

即可
let JavaErrorCodeAuthority = com.domain.ErrorCodeAuthority

每个级别的包都会自动完成。

答案 1 :(得分:1)

是的,如果您已经在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。请注意,声明模块部件不会生成任何代码,您可以将其添加到.ts.d.ts文件中。有关创建定义文件的更多信息,请访问:https://github.com/Microsoft/TypeScript/wiki/Writing%20Definition%20Files

修改

在评论的信息后,我希望下面的代码将更好地满足您的需求。 这有一个缺点,它在switch语句中不可用,但在这种情况下,我认为最好将java enum看作一个模块(或者类是可能的)。这可能不是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);