有没有办法在打字稿中描述一种“ keyfor”?

时间:2020-09-23 09:30:13

标签: typescript type-constraints keyof

是否有任何方法可以表示对象的键属性应受相关值的限制?等于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');

2 个答案:

答案 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