是否可以将属性添加到Javascript类中的方法?

时间:2020-10-10 00:10:21

标签: javascript typescript

是否可以使用公共方法创建一个类,并为该方法添加一个属性以用于另一个函数。根据我的理解,javascript中的函数只是一种特殊的对象,因此应该可以实现,但是我没有看到它是在类方法的上下文中完成的。

我还将注意到我使用typescript,因此我试图构造此类,以便对其进行强类型化。

最终目标是得到这样的结果:

const dataFetcher = new FetchData();
dataFetcher.fetch(); // fetches data synchronously
dataFetcher.fetch.async(); // fetches data asynchronously

我尝试了几种选择,但均未成功

尝试1:

class FetchData {
    public fetch(): void {
        // fetch some data
    }
    fetch.async = (): Promise<void> => { // <-- this doesn't work
        // fetch same data asyncronously
        return new Promise((resolve, reject) => resolve());
    }
}

尝试2:

interface IFetchFunction {
    (): void;
    async(): Promise<void>;
}

class FetchData {
    public test: IFetchFunction;
    constructor() {
        this.test = () => { // Typescript says the property "async" is missing on this method

        };
        this.test.async = () => {
            return new Promise((resolve, reject) => resolve());
        };
    }
}

1 个答案:

答案 0 :(得分:2)

您可以使用async同时使用Object.assign属性来创建函数。定义时,您还需要输入async函数,因为您想指定它解析为void(不是unknown,这是默认类型):

interface IFetchFunction {
    (): void;
    async(): Promise<void>;
}

class FetchData {
    public test: IFetchFunction;
    constructor() {
        this.test = Object.assign(
            () => {

            },
            {
                async: (): Promise<void> => {
                    return new Promise((resolve, reject) => resolve());
                }
            }
        );
    }
}