How to make a class implement a call signature in Typescript?

前端 未结 3 1096
无人及你
无人及你 2020-12-06 08:53

I have defined the following interface in typescript:

interface MyInterface {
    () : string;
}

This interface simply introduces a call si

3条回答
  •  执笔经年
    2020-12-06 09:50

    In case if callable interface should have other methods you can do it like this:

    interface Greeter {
        (): void;
        setName(name: string): void;
    }
    
    class ConsoleGreeter {
    
        private constructor( // constructable via `create()`
            private name = 'world'
        ) {}
    
        public call(): void {
            console.log(`Hello ${this.name}!`);
        }
    
        public setName(name: string) {
            this.name = name;
        }
    
        public static create(): Greeter {
            const instance = new ConsoleGreeter();
            return Object.assign(
                () => instance.call(),
                {
                    setName: (name: string) => instance.setName(name)
                    // ... forward other methods
                }
            );
        }
    }
    
    const greeter = ConsoleGreeter.create();
    greeter(); // prints 'Hello world!'
    greeter.setName('Dolly');
    greeter(); // prints 'Hello Dolly!'
    

    Downside: greeter instanceof ConsoleGreeter is false

提交回复
热议问题