打字稿:将对象 [名称:类型] 转换为接口

时间:2021-03-04 13:44:02

标签: typescript typescript2.0 typescript-generics

我想转换对象:

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>

请帮帮我

1 个答案:

答案 0 :(得分:0)

看起来您试图探查 typeof Numbertypeof String 的构造:为此,您将使用 construct signature 之类的 new (...args: any) => any 而不是特定的此类构造函数类型如 ObjectConstructor。类型 ObjectConstructor 特别是 typeof Object,并且具有 Object 的所有静态方法,如 Object.keys()Object.values(),其中 typeof Number 和 {{ 1}} 不。

但即使你修复它也不会给你你想要的。当您将 NumberString 值视为构造函数并调用 typeof Stringnew Number() 时,出现的 InstanceType 将是对象类型 {{1} } 和 new String() 而不是原始类型 NumberString。我假设您想要那些原始类型。

在 JavaScript 中,primitive wrappers 的构造函数也可以像普通函数(numberstring 没有 Number())一样使用,它们返回原语而不是对象。因此,对于此处显示的情况,我会探测 call signatures 之类的 String() 而不是构造签名,并获取 ReturnType 而不是实例类型:

new

Playground link to code