TypeScript中如何仅校验传入函数的对象键名,不校验值类型?
你之前的写法报错是因为keyof T返回的是泛型T的所有键名组成的联合类型(对于你的User接口来说就是"id" | "firstName" | "age"),属于基础值类型,并不是对象类型,自然不能接收对象入参。
你需要用TS内置的Record工具类型构造符合要求的对象类型,入参对象的键限制为T的合法键,值类型不做限制即可,代码如下:
interface User { id: number; firstName: string; age: number; } // 要求入参必须包含T的所有合法键,不允许传入额外键,值类型不校验 function selectMap<T>(obj: Record<keyof T, any>) {} // 如果允许只传部分T的键,改用以下定义即可 // function selectMap<T>(obj: Partial<Record<keyof T, any>>) {} selectMap<User>({ id: 'id', firstName: 'first_name', age: 'age' })
此时如果你传入的对象包含User接口中不存在的键、或者缺少必填的键,TS都会抛出类型错误,完全符合你的校验需求。
内容的提问来源于stack exchange,提问作者Jon Sud
相关产品推荐
相关产品推荐

