如何在TypeScript中为泛型T添加对象类型约束?
错误根因
这个报错是TypeScript中interface和type类型别名的索引签名兼容性差异导致的:
Record<string, unknown>约束要求泛型类型必须明确支持任意字符串键的访问,也就是必须有显式的字符串索引签名- 用
interface定义的对象类型默认没有隐式索引签名,哪怕它的结构是明确的键值对,也不会自动匹配Record<string, unknown>的约束
解决方法
方法1:把interface改成type定义
type定义的固定结构对象默认兼容Record<string, unknown>约束,改完即可正常运行:
// 将interface替换为type即可 type List = { name: string; age: number; } const arr = <T extends Record<string, unknown>> (list: T[]) => { } const list: List[] = [{name: '张三', age: 20}] arr<List>(list) // 不再报错
方法2:给interface显式添加索引签名
如果一定要用interface定义类型,给它加上显式的字符串索引签名即可满足约束:
interface List{ name: string; age: number; // 新增显式索引签名 [key: string]: string | number; }
方法3:调整泛型约束适配interface
如果不想修改原有类型定义,可以把泛型约束调整为更宽松的对象校验规则,同时避免触发object类型的lint报错:
// 用Record<PropertyKey, any>替代object/Record<string, unknown> // 既可以约束泛型为对象类型,又兼容interface定义的类型 const arr = <T extends Record<PropertyKey, any>> (list: T[]) => { }
关于object类型的lint报错说明
主流lint规则禁止直接用object做类型约束,是因为object包含了数组、函数、类实例等所有非原始类型,范围太广且无法安全访问对象属性,用上面的Record写法可以规避这个问题。
内容的提问来源于stack exchange,提问作者Subrato Pattanaik
相关产品推荐
相关产品推荐

