【问题标题】:Typescript: Instance of class typeTypescript:类类型的实例
【发布时间】:2020-05-06 10:04:02
【问题描述】:

我有一个像A_Type这样的类的类型?

class A {
  constructor(public a: string) {}
}

type A_Type = {new (a: string): A}

我想得到A_Type构造函数实例的类型,这样我就可以显式地键入这个函数

class A {
  constructor(public a: number) {}
}
//                                              ** not working **
function f<W extends { new(a: number): A }>(e: W): instanceof W {
  return new e(2)
}

let w = f(A)

我基本上是在打字稿中寻找typeof的逆运算。

【问题讨论】:

  • 你打算如何扩展它?将其他类传递给 f?

标签: typescript


【解决方案1】:

您可以使用内置的InstanceType&lt;T&gt; 实用程序来执行此操作

class A {
    constructor(public a: number) { }
}

// declare that the return value of the class constructor returns an instance of that class
function f<W extends { new(a: number): InstanceType<W> }>(e: W) {
    return new e(2) // return type is automatically inferred to be InstanceType<W>
}

let w = f(A) // w: A

Playground link

【讨论】:

  • InstanceType&lt;T&gt; 不适用于private constructor(),因为它无法推断出new () =&gt; R。有没有办法使用private constructor() 的类对typeof 进行反向操作?
【解决方案2】:
function f<W extends { new(a: number): any }, R extends W extends { new(a: number): infer U } ? U : never>(e: W): R {
  return new e(2)
}

您需要使用泛型来提取返回类型。

但是,如果您总是期望 A 的实例,您可以将其简化为

function f<W extends { new(a: number): A }>(e: W): A {
  return new e(2)
}

【讨论】:

  • 这推断为unknown
  • 正确,已修复,请验证。
  • 赞成,确实有效(不知道如何)。你能用几句话解释一下吗?
  • infer 提取嵌套类型,所以它说R 是CONDITION ? VALUE_TRUE: VALUE_FALSE 并且条件是W 是一个构造函数,然后我们返回U 否则never 是什么使R成为U。
  • A extends W extends {new (a: infer ARG): any} ? ARG : never - 现在A 是number。
【解决方案3】:

我会选择以下内容:

type Constructor<X> = {new (a: number): X}

function f<X>(e: Constructor<X>): X {
  return new e(2)
}

const w = f(A)

【讨论】:

    猜你喜欢
    • 2020-06-11
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 2023-02-03
    • 2017-08-19
    相关资源
    最近更新 更多