如何使用typeof作为通用参数值?

时间:2019-12-30 18:12:40

标签: typescript typescript-generics

我想定义一个接口,在该接口中传递通用参数,然后使用传递的值及其类型。

这类似于我要完成的工作:

interface ComponentProps<T extends new (...args: any) => any> {
  params: ConstructorParameters<typeof T>[0]
  onSubmit: (op: T) => void
}

哪个出现此错误,因为参数是一个值:

  

'T'仅指类型,但在此处用作值。ts(2693)

我可以定义此接口并将其用作:

interface ComponentProps<T> {
  onSubmit: (op: T) => void
}

type CustomComponentProps = ComponentProps<ClassA> // I can directly pass the class

interface ComponentProps<T extends new (...args: any) => any> {
  params: ConstructorParameters<T>[0]
}

type CustomComponentProps = ComponentProps<typeof ClassA> // I need to pass typeof the class

这可能是一个简单的问题,我目前还无法弄清楚,但是可以将类本身作为通用参数传递,然后在接口内部获取其类型,而无需像ComponentProps<ClassA, typeof ClassA>那样分别传递它们?

1 个答案:

答案 0 :(得分:1)

  

是否可以将类本身作为通用参数传递,然后在接口内获取其类型,而无需分别传递它们

您可以使用InstanceType获取类类型的实例类型:

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

interface ComponentProps<T extends new (...args: any) => any> {
  params: ConstructorParameters<T>[0]
  onSubmit: (op: InstanceType<T>) => void
}

declare const props: ComponentProps<typeof ClassA>
props.params // params: string
props.onSubmit(new ClassA("foo") ) // onSubmit: (op: ClassA) => void

Code sample