【问题标题】:How do I get the properties of a class as object literal type?如何将类的属性作为对象文字类型?
【发布时间】:2021-10-25 14:09:17
【问题描述】:

下面我有一个扩展JokeSignup 类。

我想要的是 v 有一个类型错误,其中用户名不能是数字,但通用 ObjectProps 无法正确获取 Signup 的属性。

Playground Link

type Constructor = new (...args: any[]) => {}

type ObjectProps<T extends Constructor, V extends Constructor | undefined = undefined> = Omit<{
    [k in keyof T]: T[k]
}, keyof V>

class Joke {
    anythingNotInOriginal: boolean = true
}

class Signup extends Joke {
    email: string = ''
    username: string = ''
    password: string = ''
}

type x = ObjectProps<typeof Signup, typeof Joke>

const v: x = {
    username: 1
}

我怎样才能让x 具有以下签名:

{ email: string, username: string, password: string }

并从Signup 类派生?

【问题讨论】:

  • “它扩展这个原始类型有一个特定的原因,所以想象一下它是任何具有自己属性的扩展类,这应该没关系”如果没关系那么为什么要分散你的问题它?我们不必想象任何事情;您可以更改问题,以免引发此类问题。
  • “用户名不能是布尔值”我在问题的其他任何地方都没有看到布尔值,这是什么意思?
  • 如果你写type X = Omit&lt;Signup, keyof Object&gt;,有什么问题?我不确定您为什么要探测构造函数类型以获取实例属性;为什么要处理typeof Signuptypeof Object 而不是SignupObject?你能提供一个minimal reproducible example 来说明你为什么要查看构造函数类型而不是实例类型吗?
  • ????更新@jcalz

标签: typescript class generics


【解决方案1】:

正如 @jcalz 在 cmets 中提到的那样,这是可行的

const v: Omit<Signup, keyof Joke> = {
    email: '',
    username: '',
    password: ''
}

【讨论】:

    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 2022-11-17
    • 2019-08-08
    相关资源
    最近更新 更多