TypeScript中能否为类型谓词函数定义泛型?
泛型类型谓词函数的实现问题
问题代码
尝试创建泛型类型谓词函数时遇到错误,代码如下:
type Items<T = any> = { [item: string]: T } type Cart<T = any> = { cart: Items<T> } type OptionalCart<T = any> = Partial<Cart<T>> type SessionHasCart = <T extends Items = Items>(session: OptionalCart<T>) => session is Cart<T> const sessionHasCart: SessionHasCart = (session) => { return (session as Cart).cart !== undefined }
错误信息(中文翻译)
类型“(session: Partial<Cart<Items<any>>>) => boolean”无法分配给类型“SessionHasCart<Items<any>>”。签名“(session: Partial<Cart<Items<any>>>): boolean”必须是类型谓词。ts(2322)
解决方案
问题出在泛型类型谓词的定义方式上:TypeScript要求类型谓词中的类型必须与函数参数的类型直接关联,而你将SessionHasCart定义为泛型类型的写法,无法让编译器正确推断泛型参数和类型谓词的绑定关系。
直接将泛型参数定义在函数上即可解决问题,同时可以去掉不必要的类型断言:
type Items<T = any> = { [item: string]: T } type Cart<T = any> = { cart: Items<T> } type OptionalCart<T = any> = Partial<Cart<T>> function sessionHasCart<T extends Items = Items>(session: OptionalCart<T>): session is Cart<T> { return session.cart !== undefined }
这样编写后,编译器能正确识别返回值为类型谓词,同时保证泛型参数T与输入的session类型和断言的Cart<T>类型一致。
内容的提问来源于stack exchange,提问作者Nicolas Bouvrette
相关产品推荐
相关产品推荐

