【加载项开发】【开发体验提升】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>类型的参数,往往能够接受能够转为数值的字符串。

广东省
浏览 130
收藏
2
分享
2 +1
12
+1
全部评论 12
 
恰同学少年
能不能导出一个离线安装包。
· 黑龙江省
回复
王子陶
王子陶

@金山办公

可以直接从npm网页上下载这些ts文件,可以以从node_modules里面提取出一个离线的npm包
· 广东省
1
回复
 
恰同学少年
大佬威武!
· 黑龙江省
回复
 
wils
wils

创作者俱乐部成员

大佬威武
· 海南省
1
回复
恰同学少年
大佬,你能不能导出一个离线安装包。放在社区。
· 黑龙江省
回复
 
初心不忘
大佬牛逼,简直救命
· 江苏省
1
回复