Typescript:转换对象[name: Type]到接口



我想转换对象:

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 Numbertypeof String的构造:为此,您将使用像new (...args: any) => any这样的构造签名,而不是像ObjectConstructor这样的特定构造函数类型。类型ObjectConstructor具体是typeof Object,并且具有Object的所有静态方法,如Object.keys()Object.values(),而typeof Numbertypeof String没有。

但是即使你修复了它也不会给你想要的。当您将NumberString值视为构造函数并调用new Number()new String()时,输出的InstanceType将是对象类型NumberString,而不是原始类型numberstring。我假定您需要这些基本类型。

在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链接到代码

相关内容

  • 没有找到相关文章

最新更新