在打字稿中推断抽象类的参数

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] 构建它

【讨论】:

以上是关于在打字稿中推断抽象类的参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中使用可选参数调用类构造函数[重复]

在打字稿中的基于 Vue 类的组件中键入 prop

在打字稿中的类中创建具有未知参数的方法

打字稿中的可选属性类

打字稿中的“三个点”是啥意思?

为啥打字稿在实现抽象函数时忽略严格的空检查?