是否有任何方法可以表示对象的键属性应受相关值的限制?等于keyof的东西,但是与给定key相关的值是什么?
const objectAction = <T extends object>(obj: T): void => obj;
const onlyForObjects = <T extends object>(obj: T, key: keyof T): void =>
objectAction(obj[key])
应该工作
onlyForObjects<{ a: number, b: object }>({ a: 0, b: {} }, 'b');
不应该工作
onlyForObjects<{ a: number, b: object }>({ a: 0, b: {} }, 'a');
答案 0 :(得分:0)
如果我正确理解了您的问题,那么以下是您的追求:
type ObjKeys<T> = {
[P in keyof T]: T[P] extends Record<any, any> ? P : never
}[keyof T]
const objectAction = <T>(obj: T): void => console.log(obj)
const onlyForObjects = <T>(obj: T, key: ObjKeys<T>): void => objectAction(obj[key])
onlyForObjects<{ a: number; b: Record<string, unknown> }>({ a: 0, b: {} }, 'b') // compiles
onlyForObjects<{ a: number; b: Record<string, unknown> }>({ a: 0, b: {} }, 'a') // does not compile
答案 1 :(得分:0)
您可以使用类型参数T
的通用Record
constraint来做到这一点:
const onlyForObjects = <T extends Record<K, object>, K extends string>(
obj: T, key: K): void => { }
onlyForObjects({ a: 0, b: {} }, 'b'); // works
onlyForObjects({ a: 0, b: {} }, 'a'); // error
这里是live code sample。