AutoJs6 icon indicating copy to clipboard operation
AutoJs6 copied to clipboard

TypeScript-Declarations更新滞后问题

Open HiColinMe opened this issue 5 months ago • 4 comments

AutoJs6类型声明项目是两年前更新的,适配AutoJs 6.5,那么对于后来新增加的类和方法,都没有跟进. 那么使用VS CODE编写项目的时候,怎么样使用新的方法提示呢?

HiColinMe avatar Jul 25 '25 02:07 HiColinMe

确实存在更新滞后的问题. 包括 AutoJs6 声明文件 (AutoJs6-TypeScript-Declarations) 及 AutoJs6 应用文档 (AutoJs6-Documentation) 衍生项目. 这些衍生项目是需要根据 AutoJs6 主项目进行调整的, 包括更新及修改等. 更多时候, 我会将有限的精力和时间放在 AutoJs6 主项目的开发上, 这会造成衍生项目的更新迟缓. 考虑到 AutoJs6 目前已暂停更新, 加上当前 Issue 已表明衍生项目的更新需求, 我会将衍生项目的更新加入计划.

SuperMonster003 avatar Jul 25 '25 04:07 SuperMonster003

好的,感谢作者大大,辛苦了. 现在Ai开发可以完成一些重复性的工作,不知道对于类型声明这种任务能不能帮到.

HiColinMe avatar Jul 25 '25 06:07 HiColinMe

确实存在更新滞后的问题. 包括 AutoJs6 声明文件 (AutoJs6-TypeScript-Declarations) 及 AutoJs6 应用文档 (AutoJs6-Documentation) 衍生项目. 这些衍生项目是需要根据 AutoJs6 主项目进行调整的, 包括更新及修改等. 更多时候, 我会将有限的精力和时间放在 AutoJs6 主项目的开发上, 这会造成衍生项目的更新迟缓. 考虑到 AutoJs6 目前已暂停更新, 加上当前 Issue 已表明衍生项目的更新需求, 我会将衍生项目的更新加入计划.

在新的TypeScript-Declarations更新之前,还有没有什么办法能够使用到最新的类型提示呢?其它小伙伴用的什么办法呢.

HiColinMe avatar Jul 25 '25 06:07 HiColinMe

是的, 而且 AutoJs6 最近几个版本的开发, 也都得到了不少 AI 技术的帮助与支持. 过去, AutoJs6 声明文件 (AutoJs6-TypeScript-Declarations) 项目中 d.ts 文件的生成, 通常是根据 \src\main\assets\modules*.js 文件中的模块属性及方法, 以此对照并写入声明文件中. 这个过程很可能可以通过 AI 来自动实现, 最后可以对生成的内容做核查, 修正或补充.

自 AutoJs6 6.6.0 起, 内置 js 模块全部转换为 kotlin 格式, 位于\src\main\java\org\autojs\autojs\runtime\api\augment\ 文件夹中.

如果你需要尽快使用新版本增加的 API 类型提示, 可以尝试手动添加 (或结合 AI 技术添加) 属性或方法到对应的 d.ts 文件当中. 例如, ui 模块新增了 statusBarIconLightBy 方法:

@JvmStatic
@RhinoRuntimeFunctionInterface
fun statusBarIconLightBy(scriptRuntime: ScriptRuntime, args: Array<out Any?>): Undefined = ensureArgumentsOnlyOne(args) { refColor ->
    ensureActivity(scriptRuntime) { activity ->
        runRhinoRuntime(scriptRuntime, newBaseFunction("action", {
            Colors.toIntRhino(refColor).also { ViewUtils.setStatusBarIconLight(activity, ViewUtils.isLuminanceDark(it)) }
        }, NOT_CONSTRUCTABLE))
    }
    UNDEFINED
}

可以看到, 它的方法签名为 statusBarIconLightBy(refColor: OmniColor): void, 因此可以在声明文件项目中的 aj6-int-ui.d.ts 文件, 添加如下内容:

class UI extends org.autojs.autojs.runtime.api.UI {

    /* 其他代码内容... */

    statusBarIconLightBy(refColor: OmniColor): void;

    /* 其他代码内容... */

}

再例如, pinyin 模块有一个 convert 方法:

@RhinoSingletonFunctionInterface
fun convert(args: Array<out Any?>): NativeArray = ensureArgumentsLengthInRange(args, 1..2) { argList ->
    val (hansArg, options) = argList
    val hans = coerceString(hansArg, "")
    val opt = options as? NativeObject ?: newNativeObject()
    /* 其他代码省略... */
}

因此可以新建一个 aj6-int-pinyin.d.ts 文件, 并添加以下内容 (仅供参考):

// Type definitions for AutoJs6 internal module pinyin
//
// Definitions by: SuperMonster003 <https://github.com/SuperMonster003>
// TypeScript Version: 5.7.3
//
// Last modified: Jul 25, 2025
//
// noinspection JSUnusedGlobalSymbols

/// <reference path="../android.d.ts"/>
/// <reference path="../libraries.d.ts"/>
/// <reference path="../index.d.ts" />

/**
 * @Source /src/main/java/org/autojs/autojs/runtime/api/augment/pinyin/Pinyin.kt
 */

declare namespace Internal {

    import List = java.util.List;
    import PinyinMode = org.autojs.autojs.runtime.api.augment.pinyin.PinyinCore.PinyinMode;
    import PinyinStyle = org.autojs.autojs.runtime.api.augment.pinyin.PinyinCore.PinyinStyle;

    class Pinyin {

        /**
         * @param hansArg 要转为拼音的目标字符串 (汉字).
         * @param options 可选, 用于指定拼音风格, 是否启用多音字等.
         * @return 返回的拼音列表.
         */
        public convert(hansArg: String, options?: ConvertOptions): PinyinResultList;

    }

    class PinyinResultList extends Array<Array<String>> {

        /**
         * 合并二维字符串数组为一维字符串数组.
         *
         * @param arr 二维数组, 如 [["zhāo", "cháo"], ["yáng"], ["dōng"], ["shēng"]]
         * @return 合并后的字符串数组, 一维结果, 如 ["zhāoyáng", "cháoyáng", "dōng", "shēng"]
         */
        public combo(arr: List<List<String>>): List<String>;

        /**
         * 组合两个拼音数组为一维字符串数组.
         *
         * @param a1 第一个拼音数组, 如 ["zhāo", "cháo"]
         * @param a2 第二个拼音数组, 如 ["yáng"]
         * @return 组合后的一维字符串数组, 如 ["zhāoyáng", "cháoyáng"]
         */
        public combo2array(a1: List<String>, a2: List<String>): List<String>;

        /**
         * 合并多个拼音数组, 形成一个新的二维数组.
         * 每两个拼音元素形成一个元组数组.
         *
         * @param arr 二维数组(每组拼音数组)
         * @return 合并后的二维拼音数组, 如 [[hai, qian], [huan, qian]]
         */
        public compact(arr: List<List<String>>): List<List<String>>;

    }

    interface ConvertOptions {

        /**
         * 模式.
         * 
         * @default 0 (PinyinMode.NORMAL)
         */
        mode?: OmniPinyinMode | null;

        /**
         * 风格.
         * 
         * @default 1 (PinyinStyle.TONE)
         */
        style?: OmniPinyinStyle | null;

        /**
         * 是否分组.
         * 
         * @default false
         */
        group?: boolean;

        /**
         * 是否分词.
         * 
         * @default false
         */
        segment?: boolean;

        /**
         * 是否允许多音字.
         * 
         * @default false
         */
        heteronym?: boolean;

    }

    declare type OmniPinyinMode = PinyinMode
        | 'normal' | 0
        | 'surname' | 1
        | 'place_name' | 'placename' | 2;

    declare type OmniPinyinStyle = PinyinStyle
        | 'normal' | 0
        | 'tone' | 1
        | 'tone2' | 2
        | 'initials' | 3
        | 'first_letter' | 4
        | 'to3ne' | 5;

}

记得在 aj6-int-init.d.ts 文件中加入新建模块的全局声明:

declare let pinyin: Internal.Pinyin;
declare let $pinyin: Internal.Pinyin;

可以看出, 声明文件中的内容生成, 需要对模块的功能和设计目的等有相对深入且全面的了解, 因此具备一定程度的挑战性.

org.autojs.autojs.runtime.api.augment.pinyin.PinyinCore.PinyinMode 等类的声明类型, 位于 aj6-main-app.d.ts 文件中. 此文件的生成, 需要用到 Android d.ts Generator by NativeScript 工具, 及 AutoJs6 最新项目编译的 class.jar 文件 (路径样例: \app\build\intermediates\compile_app_classes_jar\appDebug\bundleAppDebugClassesToCompileJar\classes.jar). 如对这部分内容感兴趣或存在疑问, 可继续反馈.

SuperMonster003 avatar Jul 25 '25 09:07 SuperMonster003