【发布时间】:2021-08-23 01:37:13
【问题描述】:
给定一个任意类型,我想检查该类型是否是原型为Object.prototype 的对象。换句话说,我想排除函数、集合、映射、自定义类等。我不能只列出所有可能的对象类型,因为自定义类的数量是无限的。这可能吗?
我想这样做以递归地将映射应用于对象。这是我所拥有的:
type MapDeep<T> = F<
T extends Primitive ? T
: T extends Array<infer U> ? Array<MapDeep<U>>
: T extends ReadonlyArray<infer U> ? ReadonlyArray<MapDeep<U>>
: T extends Set<infer U> ? Set<MapDeep<U>>
: T extends Map<infer K, infer V> ? Map<K, MapDeep<V>>
: T extends Partial<Record<string, any>> ? { [K in keyof T]: MapDeep<T[K]> }
: T
>;
但是,对于原型不是Object.prototype 的对象,这不起作用。例如。 MapDeep<() => void> 返回 F<{}> 而不是 F<() => void>,因为它匹配 Partial<Record<string, any>>。如何判断一个类型的原型是否为Object.prototype?
【问题讨论】:
-
F在这里输入什么? -
F是任意输入的任意变换 -
"* 例如,
MapDeep<() => void>返回F<{}>而不是F<() => void>,因为它匹配Partial<Record<string, any>>.*" - 好吧,函数 是 一个对象,所以这是对的。您的代码(即使用MapDeep的函数实现)实际上是否特别对待函数?然后,您还需要在该类型声明中测试可调用对象。
标签: javascript typescript