【问题标题】: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

【问题讨论】:

标签: typescript arguments abstract-class type-inference typescript-generics


【解决方案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] 构建它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2018-11-01
    相关资源
    最近更新 更多