我想转换对象:
var user = {
id: Number,
name: String
}
界面:
type User = {
id: number
name: string
}
现在我尝试这个:
type Transform<T extends { [key: string]: ObjectConstructor }> = {[P in keyof T]: (T)[P]['prototype']}
type User = Cast<typeof user>
请帮帮我
看起来您试图探测typeof Number
和typeof String
的构造:为此,您将使用像new (...args: any) => any
这样的构造签名,而不是像ObjectConstructor
这样的特定构造函数类型。类型ObjectConstructor
具体是typeof Object
,并且具有Object
的所有静态方法,如Object.keys()
和Object.values()
,而typeof Number
和typeof String
没有。
但是即使你修复了它也不会给你想要的。当您将Number
和String
值视为构造函数并调用new Number()
或new String()
时,输出的InstanceType
将是对象类型Number
和String
,而不是原始类型number
或string
。我假定您需要这些基本类型。
在JavaScript中,原语包装器的构造函数也可以像普通函数一样使用(Number()
或String()
,没有new
),它们返回原语而不是对象。因此,对于这里所示的情况,我将探测像(...args: any) => any)
这样的调用签名,而不是构造签名,并获得ReturnType
而不是实例类型:
type Transform<T extends Record<keyof T, (...args: any) => any>> = {
[P in keyof T]: ReturnType<T[P]>
};
type User = Transform<typeof user>
/* type User = {
id: number;
name: string;
} */
Playground链接到代码