TypeScript如何验证对象键属于泛型的键并解决返回值类型报错
报错根因
该类型报错是TypeScript对泛型场景下的计算属性字面量推导的局限性导致的:当你直接返回包含[key]计算属性的对象字面量时,TS会自动将该对象的键类型扩宽为string,无法和ResponseGeneric<T>中限定为keyof T的键做兼容性匹配,因此抛出2322错误。
4.2+版本兼容的无断言实现方案
你可以通过先初始化符合返回类型的空对象,再对指定键赋值的写法绕开推导限制,全程不需要加类型断言,完全类型安全:
type ResponseGeneric<T> = { [K in keyof T]?: { otherProp: any }; } function validateGeneric<T>(key: keyof T, value: any): ResponseGeneric<T> { // 提前声明返回值类型,TS会校验后续赋值的合法性 const res: ResponseGeneric<T> = {}; // key本身是keyof T类型,符合ResponseGeneric<T>的键要求,赋值可通过校验 res[key] = { otherProp: value }; return res; }
可选简化方案(TS4.9及以上支持)
如果你可以升级到TS4.9及以上版本,可以用satisfies操作符更简洁地实现,同样不需要类型断言:
function validateGeneric<T>(key: keyof T, value: any): ResponseGeneric<T> { return { [key]: { otherProp: value, }, } satisfies ResponseGeneric<T>; }
内容的提问来源于stack exchange,提问作者Agustin Garcia
相关产品推荐
相关产品推荐

