graalvm typescript types 编写定义参考说明

以下只是一个简单的学习,大家可以参考,然后基于此扩展

案例说明

就是一个简单的java.math.BigInteger 定义

参考定义

  • package.json
{
  "name": "@dalongrong/graalvm-type-learning",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "types": "dist/index.d.ts",
  "devDependencies": {
    "typescript": "^4.6.4"
  },
  "files": [
    "dist/*.d.ts"
  ],
  "scripts": {
    "app":"tsc",
    "watch":"tsc --watch",
    "p":"yarn publish"
  },
  "publishConfig": {
    "access": "public",
    "registry": "https://registry.npmjs.com"
  }
}
  • tsconfig.json
{
  "include": [
    "src/*"
  ],
  "compilerOptions": {
    /* Visit https://aka.ms/tsconfig.json to read more about this file */
    "outDir": "dist",
    "declaration": true,
    /* Language and Environment */
    "target": "ESNext",                                  /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
    "lib": ["DOM","ES2015","ES2020.BigInt"],
    /* Modules */
    "module": "commonjs",                                /* Specify what module code is generated. */
    "esModuleInterop": true,                             /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */
    "forceConsistentCasingInFileNames": true,            /* Ensure that casing is correct in imports. */
    /* Type Checking */
    "strict": true,                                      /* Enable all strict type-checking options. */
    /* Completeness */
    // "skipDefaultLibCheck": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */
    "skipLibCheck": true                                 /* Skip type checking all .d.ts files. */
  }
}
  • index.d.ts
// 类型定义,类似一个map
interface JavaType {
    "java.math.BigInteger": typeof Java.math.BigInteger;
}
 
/**
 * just for type definition don't use it directly
 */
declare namespace Java {
    namespace math {
       // BigInteger 定义
        class BigInteger {
             public static valueOf(value:bigint):BigInteger;
             pow(exponent:number):BigInteger;
             toString():string;
             toString(radix:number):string;
        } 
    }
    /**
     *  工具类实现type 的获取
     * @param key get java type must use --jvm with java interop
     */
    function type<Key extends keyof JavaType>(key: Key):JavaType[Key]
}

项目使用

  • package.json
{
  "name": "g-ts",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "app": "tsc --watch"
  },
  "devDependencies": {
    "@dalongrong/graalvm-type-learning": "^1.0.0"
  }
}
``
tsconfig.json
```code
{
  "include": [
    "src/*"
  ],
  "compilerOptions": {
    /* Visit https://aka.ms/tsconfig.json to read more about this file */
    "types": ["@dalongrong/graalvm-type-learning"],
    "outDir": "dist",
    "lib": ["ESNext.BigInt","ESNext","DOM"],
    "target": "es2016",                                  /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
    "module": "commonjs",                                /* Specify what module code is generated. */
    "esModuleInterop": true,                             /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */
    "forceConsistentCasingInFileNames": true,            /* Ensure that casing is correct in imports. */
    "strict": true,                                      /* Enable all strict type-checking options. */
    "skipLibCheck": true                                 /* Skip type checking all .d.ts files. */
  }
}
  • src/app.ts
let app = Java.type("java.math.BigInteger")
console.log(app.valueOf(BigInt("33")).pow(33).toString(16))
  • 安装graalvm nodejs
    需要安装graalvm,以及nodejs 可以使用如下命令 (通过sdkman),graalvm 21 之后nodejs 需要独立安装
 
sdk install java 22.1.0.r17-grl
gu install nodejs
  • 运行
<path to graalvm bin dir >/22.1.0.r17-grl/bin/node --jvm  dist/app.js 
  • 效果

 

 

说明

以上只是一个简单的开头,以及如果集成使用,我们可以扩展下,实际上es4x 已经实现了以上的一些类型能力,而且包含了自动化的工具

参考资料

https://www.npmjs.com/package/@dalongrong/graalvm-type-learning
https://www.graalvm.org/22.1/reference-manual/js/
https://reactiverse.io/es4x/

posted on 2022-05-05 21:54  荣锋亮  阅读(162)  评论(0编辑  收藏  举报

导航