打字稿静态函数没有接收参数

Posted

技术标签:

【中文标题】打字稿静态函数没有接收参数【英文标题】:Typescript static function isn't receiving arguments 【发布时间】:2020-12-15 14:05:00 【问题描述】:

我试图从 Typescript 对象的公共函数中访问静态函数,但它似乎不起作用。

目标是在 Vue 中实现一个 Angular 风格的表单验证器。父组件定义了一个ReactiveFormElement 对象数组,它们是实际表单控件的控制器。它们在创建时可以接收两个参数:一个值和一个验证器数组。

验证器是另一个对象中的静态函数。

这是一个简化的纲要:

父组件:

import ReactiveFormElement from '@/components/ReactiveFormElement';
import Validators from '@/services/validators';
...

    public formData = 
        title: new ReactiveFormElement('', [Validators.required]),
    ;

反应式表单元素:

export default class ReactiveFormElement 

    constructor(
        public value?: any,
        public validators: Function[] = [])  

    public validate() 
        console.log('Sending to validator: ' + this.value);
        const error = validator.call(this.value);
    


验证器如下所示:

export default class Validators 

    static required(value: any) 
        console.log('Validator received: ', value);
        if (typeof value === 'undefined' || !value)
            return 'This value is required'
        else
            return null;
    

问题:我传递给验证器的任何内容最终都会成为undefined。如您所见,我正在打印从ReactiveFormElement.validate()Validators.require() 发送到控制台的值。输出是:

Sending to validator: Some string
Validator received: undefined

为什么未定义?

如果验证器函数不是静态的,它也无济于事。 如果我使用 apply 而不是 call (当然,将值放入数组中),这将无济于事。 有趣的是,如果我从父组件调用验证器,它就可以工作。但它拒绝在 ReactiveFormElement 内部工作。

【问题讨论】:

你为什么使用.call 字面意思是因为为什么不呢? 开个玩笑吧?这就是您的代码不起作用并且您没有做任何需要它的事情的原因。 为什么不呢? call() 没有任何问题,它现在工作得很好。查看两个答案。 【参考方案1】:

问题在于您的范围。如果您将this 作为第一个参数传递给调用方法(请参阅https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Function/call),您的方法将收到正确的输入。

工作sn-p:

class ReactiveFormElement 

    constructor(
        public value?: any,
        public validators: Function[] = [])  

    public validate() 
        console.log('Sending to validator: ' + this.value);
        this.validators.forEach(validator =>
            validator.call(this, this.value));
    


class Validators 

    static required(value: any) 
        console.log('Validator received: ', value);
        if (typeof value === 'undefined' || !value)
            return 'This value is required'
        else
            return null;
    


const formElement = new ReactiveFormElement('foo', [Validators.required]);
formElement.validate();

【讨论】:

以上是关于打字稿静态函数没有接收参数的主要内容,如果未能解决你的问题,请参考以下文章

使用静态方法的打字稿继承

打字稿递归函数组合

打字稿没有正确推断剩余参数

打字稿:猫鼬模式的静态方法

打字稿中有啥好的静态代码分析工具吗? [关闭]

在nodejs和打字稿中使用变量到静态方法