打字稿:从方法参数中调用方法

lomas09

我想这更多是一个好奇心问题,如果它可以实际在打字稿中实现,那就太好了。

基本上我有一个类和其中的两个方法,如下所示:

这可能吗?


class MyClass{
   private cleanup(str:String):String{
     //clean up the string
     return str; //return sanitized string
   }
   //I want to do this
   insertString(this.cleanup(text_1:String), this.cleanup(text_2:String)){
     console.log(text_1 + text_2);
   }
}

而不是这个?


class MyClass{
   private cleanup(str:String):String{
     //clean up the string
     return str; //return sanitized string
   }
   //might get to long if I have to cleanup to many strings
   insertString(text_1:String, text_2:String){
     text_1 = this.cleanup(text_1)
     text_2 = this.cleanup(text_2)
     console.log(text_1 + text_2);
   }
}

祖勒

您要实现的实际上不是从另一个方法签名中调用一个方法。更多有关处理参数列表的信息。

1:arguments骇客

您可以修改提供的arguments数组,并且相应的命名参数也将更改。

insertString(text_1:String, text_2:String) {
    // here text_1 and text_2 are not cleaned up yet
    for (var i = 0; i < arguments.length; i++) {
        arguments[i] = this.cleanup(arguments[i])
    }
    // text_1 and text_2 are now cleaned up
}

但是,这种方法有点骇人听闻,您可以选择#2:

2:装饰器

我们声明了两个修饰符:一个名为的参数修饰符cleanup

function cleanup(target: Object, propertyKey: string | symbol, parameterIndex: number) {
    let cleanupParams: number[] = Reflect.getOwnMetadata("MyClass:cleanup", target, propertyKey) || [];
    cleanupParams.push(parameterIndex);
    Reflect.defineMetadata("MyClass:cleanup", cleanupParams, target, propertyKey);
}

一个名为方法的装饰器CleanupMethod(实际上是一个装饰器工厂):

function CleanupMethod(func){
    return function (target: any, propertyName: string, descriptor: TypedPropertyDescriptor<Function>) {
        let method = descriptor.value;
        descriptor.value = function () {
            let requiredParameters: number[] = Reflect.getOwnMetadata("MyClass:cleanup", target, propertyName);
            if (requiredParameters) {
                for (let parameterIndex of requiredParameters) {
                    arguments[parameterIndex] = func(arguments[parameterIndex]);
                }
            }
            return method.apply(this, arguments);
        }
    }
}

在装饰器中,我们保存一个清单,其中应在函数enter中清除哪些参数,然后在每次调用时清除它们。

用法:

class MyClass{
    private cleanup(str:string):string{
        //clean up the string
        return '[sanitized ' + str + ']'; //return sanitized string
    }
    @CleanupMethod(MyClass.prototype.cleanup)
    insertString(text_1:string, @cleanup text_2:string){
        console.log(text_1 + text_2);
    }
    @CleanupMethod(MyClass.prototype.cleanup)
    insertNumber(n1: number, n2: number, @cleanup n3: number, n4: number, n5: number){
        console.log(`${n1} + ${n2} + ${n3} + ${n4} + ${n5}`)
    }
}
var m = new MyClass();
m.insertString('a', 'b') // outputs `a[sanitized b]`
m.insertNumber(10,20,30,40,50) // outputs `10 + 20 + [sanitized 30] + 40 + 50`

清除功能作为参数传递给CleanupMethod工厂。这样,您可以拥有不同的清理功能,例如:

@CleanupMethod(cleanupString)
insertString( @cleanup str1: string, @cleanup str2: string2 ){
    /*...*/
}
@CleanupMethod(cleanupNumber)
insertNumber( @cleanup n1: number ){
    /*...*/
}

如果需要,可以重写装饰器代码并将清除函数移至参数装饰器,但这将增加所需的代码量:

@CleanupMethod
insertString( @cleanup(cleanupString) str1: string, @cleanup(cleanupNumber) n1: number ){
    /*...*/
}

有关装饰器的更多信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在打字稿中调用父方法

来自分类Dev

打字稿方法未调用

来自分类Dev

如何在打字稿中递归调用方法

来自分类Dev

重载打字稿中的方法

来自分类Dev

打字稿中的绑定方法

来自分类Dev

更改网址后调用打字稿方法

来自分类Dev

从重写的方法调用打字稿`super`

来自分类Dev

从打字稿调用 JavaScript 方法

来自分类Dev

如何正确覆盖打字稿中的方法?

来自分类Dev

使用Jest作为打字稿中的方法

来自分类Dev

打字稿-如何强制调用类方法?(使方法强制)

来自分类Dev

如何在 React Native 打字稿中从父级调用子组件方法

来自分类Dev

如何使用打字稿和敲除调用对象实例方法

来自分类Dev

打字稿:调用另一个类的“方法”

来自分类Dev

如何从 gulpfile.js 调用打字稿方法

来自分类Dev

外部函数与内部函数调用的打字稿类方法

来自分类Dev

为什么打字稿不检查接口方法的参数

来自分类Dev

“ Duck”打字与打字稿中的函数参数

来自分类Dev

打字稿-声明通用方法

来自分类Dev

通用方法的打字稿接口

来自分类Dev

从打字稿中的静态方法中检索类名称

来自分类Dev

如何在Angular2 RC5打字稿中调用共享指令的方法?

来自分类Dev

如何在CDK打字稿的addToPolicy方法中添加sid

来自分类Dev

如何在打字稿中扩展工厂方法

来自分类Dev

覆盖打字稿中的私有方法

来自分类Dev

是否可以在打字稿方法中创建接口?

来自分类Dev

在Angular 2服务中创建打字稿方法

来自分类Dev

在打字稿模块中声明异步方法

来自分类Dev

使用类的方法在打字稿中创建联合类型