我需要知道是否可以在 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'.
(供参考,超级
HttpResult
是一个包含number
http code and a
stringbody. HttpStatus, in the Java enum, is of type
org.springframework.http.HttpStatus`的对象)。
我尝试删除
export function type(arg: "com.domain.ErrorCodeAuthority"): ErrorCodeAuthority;
行,但这并没有改变异常。
如果有不同,我们将在 nashorn 容器中运行所有这些
是否可以在 Typescript 中做同样的事情?
是的。使用tyrian,你可以写
let JavaErrorCodeAuthority = com.domain.ErrorCodeAuthority
每一层包都会自动完成
是的,如果您已经在 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”的枚举和第一个类型函数是可选的,但在传入该特定字符串时它会为您提供更好的类型信息。请注意,声明模块部分不会生成任何代码,您可以将其添加到
.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);