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
相关产品推荐
相关产品推荐

