【问题标题】:How to check if an object type's prototype is Object.prototype in Typescript?如何检查对象类型的原型是否是 Typescript 中的 Object.prototype?
【发布时间】: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&lt;() =&gt; void&gt; 返回 F&lt;{}&gt; 而不是 F&lt;() =&gt; void&gt;,因为它匹配 Partial&lt;Record&lt;string, any&gt;&gt;。如何判断一个类型的原型是否为Object.prototype

【问题讨论】:

  • F 在这里输入什么?
  • F 是任意输入的任意变换
  • "* 例如,MapDeep&lt;() =&gt; void&gt; 返回 F&lt;{}&gt; 而不是 F&lt;() =&gt; void&gt;,因为它匹配 Partial&lt;Record&lt;string, any&gt;&gt;.*" - 好吧,函数 一个对象,所以这是对的。您的代码(即使用MapDeep 的函数实现)实际上是否特别对待函数?然后,您还需要在该类型声明中测试可调用对象。

标签: javascript typescript


【解决方案1】:

这是不可能的。 typescript 类型不包含对象原型链的信息,它只指定属性的类型接口及其签名。

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2011-02-14
    • 2016-11-24
    • 2022-01-25
    • 2011-02-08
    • 2013-02-02
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多