larksuite / node-sdk

larksuite open sdk for nodejs
MIT License
131 stars 26 forks source link

上传图片client.im.image.create返回值类型问题 #49

Closed HappyYA closed 1 year ago

HappyYA commented 1 year ago
image

这个联合类型有问题,取值时报错,空对象中不存在image_key。 建议不要将{}当作类型使用

mazhe-nerd commented 1 year ago

你好同学,感谢建议。看了下现状,因为create接口的返回值现在是{ image_key?: string },表示所有的数据都会塞在这个对象里,后面可能会往里面追加内容;代码中做了一层兼容:如果接口调用成功但无返回值,那么就返回一个默认对象。这也是符合语义的。 ({}).image_key会返回undefined,业务代码里可以加个判断?

HappyYA commented 1 year ago

问号的含义不就是里面的参数可选吗?{ image_key?: string }这个类型不就是代表返回值是{image_key: string}或者{}吗?

mazhe-nerd commented 1 year ago

在这个场景下是这样哈。我补充一些背景:

  1. code-gen中的代码是拉开放平台文档的描述数据自动生成的,需要兼容所有返回值的情况,有些api返回值中的内容并不都是可选的。
  2. api的入参和出参会随着业务迭代而变动。
  3. 需要兼容api调用成功,但是返回值为null的异常情况。

在以上3个背景下,直接用统一的处理方式会比较适当。当然,针对这个api的场景,返回值的类型描述为{ image_key?: string }是最佳的,但如果对所有特殊场景做优化的话,必要性上需要找一个判断。

HappyYA commented 1 year ago

如你所述,接口返回值可能是null ,那应该使用null做为后面的兜底类型,而不是一个空对象。 如果参数后续会变动可以增加签名保证兼容性。 如果类型文件是自动生成,无法修改,那没办法了。

image

对于{}类型eslint是这样说的

image

我又把这个类型丢给claude

image
mazhe-nerd commented 1 year ago

这确实是一个问题,在使用上很不方便。我统计了下现在拉到的数据,这类场景可以做这个改动。 1.16.1已修复。感谢同学提供建议。