You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript调用get('id')出现类型不兼容错误,请求修复方案

TypeScript错误分析与修复

错误原因

1. 参数类型提示never的根源

User是BookshelfEntity<Student> | BookshelfEntity<Admin>的联合类型,原定义中BookshelfEntity<T>的get属性是所有(k: K) => T[K]函数的联合(K遍历T的所有键)。当调用联合类型的方法时,TypeScript要求参数必须满足所有分支方法参数的交集——因为无法确定当前调用的是联合中的哪一个函数,必须传入所有函数都能接受的参数。

这里每个分支函数的参数是单一字面量(比如"name"、"password"等),所有字面量的交集是空集,即never,所以传入string类型的'id'会触发string无法赋值给never的错误。

2. 返回类型不匹配的原因

原定义中get的返回值是所有分支函数返回类型的联合(string | number | boolean),但getStudentId声明返回string,类型范围不匹配,导致返回值错误。

修复方案

问题核心是BookshelfEntity的get属性定义错误,不应将其定义为多个函数的联合,而应定义为泛型方法,让TypeScript能根据传入的键推断对应返回类型。

修改后的完整代码:

type Admin = {
  id: string
  email: string
  password: string
  age: number
  isMaster: boolean
  // ...
}

type Student = {
  id: string
  name: string
  email: string
  age: number
  isActive: boolean
  // ...
}

interface BookshelfEntity<T extends {}> {
  get<K extends keyof T>(k: K): T[K];
  toJSON: () => T;
}

type User = BookshelfEntity<Student> | BookshelfEntity<Admin>

const getStudentId = (user: User): string => user.get('id')
// 无类型错误

修复原理

将get改为泛型方法后:

  • 当调用user.get('id')时,TypeScript会对联合类型User进行分布式处理,分别检查BookshelfEntity<Student>和BookshelfEntity<Admin>的get方法,两者的id字段类型都是string,因此返回类型确定为string,符合函数声明要求。
  • 参数'id'是Student和Admin共有的键,属于keyof Student & keyof Admin,满足泛型参数K extends keyof T的约束,不会触发参数类型错误。

内容的提问来源于stack exchange,提问作者ibodi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:25:17