如何在不使用“any”的情况下实现以下示例

How can I implement the following example without using "any"

提问人:VoidfullBrain 提问时间:2/3/2023 最后编辑:Henry EckerVoidfullBrain 更新时间:2/5/2023 访问量:87

问:

我有一些类,让我们称它们为:ExampleClassOneExampleCLassTwo

abstract class AbstractExampleClass {
    protected member: SomeClass;

    constructor(member: SomeClass) {
        this.member = member;
    }
}


class ExampleClassOne extends AbstractExampleClass {
    
    public methodOne() {
        // Do something
    }

    public methodTwo() {
        // Do something different
    }
}

class ExampleClassTwo extends AbstractExampleClass {
    
    public methodThree() {
        // Do something
    }

    public methodFour() {
        // Do something different
    }
}

我有一个配置,如下所示:

const config = {
    classes: 
    [
        {
            className: ExampleClassOne 
            methods: 
            [
                {
                    method: 'methodOne',
                },
                {
                    method: 'methodeTwo',
                },
            ]

        },
        {
            className: ExampleClassTwo 
            methods: 
            [
                {
                    method: 'methodThree',
                },
                {
                    method: 'methodeThree',
                },
            ]

        },
        
    ]

}

现在,我使用方法数组的内部迭代遍历配置数组,如下所示:

for(let i = 0; i < config.length; i++) {
    const configClass = config.classes[i];
    for(let j = 0; j < configClass.methods.length) {
        initializeObjectAndCallMethod(configClass.name, configClass.methods[j].method);
    }
};

initializeObjectAndCallMethod看起来像这样:

initializeObjectAndCallMethod(className: {new (member: SomeClass): any}, methodName: string): void {
    const memberObject = new SomeClass();
    const object = new className(memberObject );
    const method = methodName as keyof typeof object;
    
    if(object.hasOwnProperty(method)) {
        object[method]();
    }
}

如果我在函数声明中使用这样的任何 - - 一切正常。initializeObjectAndCallMethod(class: {new (member: SomeClass): any}, methodName: string)

一种不使用任何方法的方法是将任何交换与以下内容交换:.但这会引发错误:此表达式不可调用。类型“never”没有呼叫签名。因为,正如@geoffrey所指出的,没有公共成员,并且 linter 对我从配置中传递的类一无所知。AbstractExampleClassinitializeObjectAndCallMethod(className: {new (member: SomeClass): AbstractExampleClass}, methodName: string): voidAbstractExampleClass

这就是我的问题所在:有没有可能不在那里使用“任何”或其他方式来实现我在那里所做的事情?

TypeScript 泛型 方法 调用 任何

评论

0赞 geoffrey 2/3/2023
AbstractExampleClass没有任何成员,所以是。keyof AbstractExampleClassnever
0赞 geoffrey 2/3/2023
顺便说一句,您应该避免使用关键字作为变量/参数/属性名称class
0赞 VoidfullBrain 2/3/2023
@geoffrey它就是一个例子。我本可以命名其他任何东西,但为了你,我会改变它。
0赞 VoidfullBrain 2/3/2023
@geoffrey有一个成员,称为 member。但这不是重点。AbstractExampleClass
0赞 VoidfullBrain 2/3/2023
@geoffrey 关键是,我的抽象类用于定义构造函数和称为 member 的成员,并且是子类的父类,因此我可以告诉 linter 我想传递给函数的类类型。我的问题指向一个事实,如果我告诉 linter 传递的参数的类型是 any,这个例子可以正常工作,但我如何以正确的方式做到这一点。

答: 暂无答案