• 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/

  • 相关阅读:
    1.8 接口中的静态方法
    1.7 默认方法
    1.6 变量作用域
    汉字转拼音
    1.5 构造器引用
    1.4 方法引用
    循环中冲不掉外部定义的变量
    getBoundingClientRect
    Angular1.0 在Directive中调用Controller的方法
    horizontalDragMaxWidth:0;就没有水平滚动条了
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/16226561.html
Copyright © 2020-2023  润新知