1

有什么方法可以表示对象的键属性应受相关值的限制?相当于 keyof 但与给定键相关的值?

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');
4

2 回答 2

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

于 2020-09-23T09:58:38.343 回答
0

您可以使用类型参数的通用约束来做到这一点:Record T

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

这是一个 实时代码示例

于 2020-09-23T09:58:54.153 回答