简体   繁体   中英

How to check if an object type's prototype is Object.prototype in Typescript?

Given an arbitrary type, I want to check if the type is an object whose prototype is Object.prototype . In other words, I want to exclude Functions, Sets, Maps, custom classes, etc. I can't just list every possible object type, since there's an infinite number of custom classes. Is this possible?

I want to do this to recursively apply a mapping to an object. Here's what I have:

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
>;

However, for objects that have prototypes other than Object.prototype , this doesn't work. Eg MapDeep<() => void> returns F<{}> instead of F<() => void> , since it matches Partial<Record<string, any>> . How can I tell if a type's prototype is Object.prototype ?

This is not possible. A typescript type does not contain information about the prototype chain of an object, it only specifies the type interface of properties and their signatures.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM