Skip to content

client SDK 的 meta.getItem 没有声明返回类型(载荷为 unknown),而并排的 meta.getItems 有 —— 同一表面上相邻两个方法的类型化不对等 #5545

Description

@baozhoutao

#5449@objectstack/client 的测试层接进 tsc 时暴露(src/client.test.ts(106,16): error TS18046: 'result' is of type 'unknown')。基线 origin/main @ 9894a723e

事实

packages/client/src/index.ts,meta 表面上相邻的两个方法:

getItems: async (type: string, options?: { packageId?: string }): Promise< GetMetaItemsResponse > => { … }   // :486 有声明

getItem:  async (type: string, name: string, options?: { packageId?: string }) => {                          // :502 无声明
  …
  return this.unwrapResponse(res);
},

getItem 没有返回类型注解,推断出的就是 unwrapResponse 的返回类型,调用方拿到 unknown,要读任何字段都得先自己断言。测试里那行 expect(result.name) 之所以从来没红过,只是因为该文件此前不在任何 tsc program 内(#5449 记录的那个盲区)。

影响

  • SDK 使用者调 client.meta.getItem('object', 'customer') 后无法直接读取字段,必须 as —— 而并排的 getItems 不需要。这种不对等会诱导调用方对整个 meta.* 表面统一 as any,把真实的形状错误一并盖掉。
  • 属于 AI 生成的元数据应用最容易踩的一类:消费端容忍(as)一旦成为习惯,producer 的形状漂移就没有报警面了。

处置

#5449 的 PR 只在测试里把断言从 result.name 改成 expect(result).toMatchObject({ name: 'customer' }) —— 不加 cast,不假装这个表面已被类型化,断言强度不变。真正的修法是给 getItem 声明返回类型(spec 里对应的响应 schema),那属于 client SDK 的公开签名,应单独定案。

顺带核对是否还有别的 meta.* / data.* 方法漏了返回类型注解,一并补齐。

关联:#5449#4311

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions