【加载项开发】【开发体验提升】wpsjs typescript 类型系统增强
@金山办公
更新内容
wps加载项的typescript类型描述中超过3000个any类型已经被替换成具体的类型。无论加载项是用JavaScript语言还是typescript语言开发,带有typescript语言服务器功能的ide都能正确提示这些类型。
作用
改善wps加载项的开发体验。
让开发者更容易了解any类型参数能接受的类型。
增强ide对加载项api的补全和分析能力
降低ai对加载项api的类型方面的幻觉
方便开发者深入探索wps jsapi的更多功能。
截图
表格的Range.Find api。现在ide可以直接显示参数的类型
Range.Item,原本返回值是any类型,现在能补全了
表格的Range api
安装方法
在加载项的package.json中更新以下npm包,然后运行npm install来下载typescript:
et-jsapi-declare 2.5.0
wps-jsapi-declare 2.2.0
wpp-jsapi-declare 1.2.0
背景
api中的any类型含量高达33%
这些any类型来源于微软的vba api,在vba api中表示为VARIANT类型。
实现原理
我们利用clang编译器静态分析C++代码,跟踪jsapi的每一个参数的传播路径,分析any类型和object类型的参数和返回值和字段在实现代码中可能的类型。
分析工具是用clang编译器库,polodb数据库,tokio异步库,petgraph图算法库等库实现的。
一个参数可能接受多种类型,而在新的typescript中,这些类型会用typescript的“|“运算来表示。
wps的jsapi中有不少api未实现,部分参数未被使用。这部分保持原本的any或object类型。其他参数和返回值和属性类型的识别率达到了80%。
局限性
由于静态代码分析方法的局限性,部分参数的类型可能缺少,或者有冗余。这通常是因为部分代码是黑盒,部分代码中检查类型后却没有把检查的结果用于计算,部分代码中操作的类型种类远多于逻辑上有可能接受或返回的类型种类。
api实现代码中js值转成的VARIANT会被隐式类型转换,而且其转换规则通常遵循VBA的类型转换规则,而不是JavaScript的类型转换,导致类型不准确。例如一个TypedAny<number>类型的参数,往往能够接受能够转为数值的字符串。
@金山办公
创作者俱乐部成员