在打字稿中推断抽象类的参数
Posted
技术标签:
【中文标题】在打字稿中推断抽象类的参数【英文标题】:Infer arguments for abstract class in typescript 【发布时间】:2019-12-29 18:37:26 【问题描述】:我正在尝试获取 typescript 类和函数的参数。
export type CtorArgs<TBase> = TBase extends new (...args: infer TArgs) => infer Impl ? TArgs : never;
export type AbsCtorArgs<TBase> = TBase extends constructor: (...args: infer TArgs) => infer Impl ? TArgs : never;
export type FuncArgs<TBase> = TBase extends (...args: infer TArgs) => infer Impl ? TArgs : never;
function RegularFunction(a:string,b:number)
class RegularClass
constructor(a:string,b:number)
abstract class AbstractClass
constructor(a:string,b:number)
type thing = [
CtorArgs<typeof RegularClass>,
FuncArgs<typeof RegularFunction>,
AbsCtorArgs<typeof AbstractClass>,
CtorArgs<typeof AbstractClass>,
FuncArgs<typeof AbstractClass>
];
但由于某些原因,抽象类不返回其构造函数的参数。
我怀疑这是因为new
关键字isn't available on abstract classes。有人知道如何获取抽象类构造函数中实际存在的那些参数吗?
不,这不是关于实例化抽象类,而是关于从抽象类继承的类和该类的参数的依赖注入。 See here
【问题讨论】:
Abstract constructor type in TypeScript的可能重复 绝对不是重复的,我也想知道这个。这专门用于从抽象类中检索构造函数的参数。 【参考方案1】:可以推断abstract
类的参数。您只需要在new
之前添加abstract
关键字即可。
查看示例:
abstract class AbstractClass
constructor(a: string, b: number)
export type InferAbstract<T> = T extends abstract new (...args: infer Args) => infer _ ? Args : never;
type Result = InferAbstract<typeof AbstractClass> // [a: string, b: number]
但您甚至不需要使用某些自定义实用程序类型。您可以使用在 TS 3.1 中引入的 [ConstructorParameters][1]
构建它
【讨论】:
以上是关于在打字稿中推断抽象类的参数的主要内容,如果未能解决你的问题,请参考以下文章