Как сделать класс реализовать подпись вызова в машинописном?

голоса
26

Я определил следующий интерфейс в машинописи:

interface MyInterface {
    () : string;
}

Этот интерфейс просто вводит вызов подписи, который не принимает никаких параметров и возвращает строку. Как реализовать этот тип в классе? Я попробовал следующее:

class MyType implements MyInterface {
    function () : string {
        return Hello World.;
    }
}

Компилятор продолжает говорить мне, что

Class «MyType» объявляет интерфейс «MyInterface», но не реализует его: Тип «MyInterface» требует подписи вызова, но Type «MyType» не хватает одного

Как я могу реализовать подпись вызова?

Задан 07/10/2012 в 15:22
источник пользователем
На других языках...                            


3 ответов

голоса
11

Классы не могут соответствовать этому интерфейсу. Ближайший вы можете получить, я думаю, что этот класс, который будет генерировать код, который функционально соответствует интерфейсу (но не в соответствии с компилятором).

class MyType implements MyInterface {
  constructor {
    return "Hello";
  }
}
alert(MyType());

Это будет генерировать рабочий код, но компилятор будет жаловаться , что MyTypeне отозван , поскольку он имеет подпись new() = 'string'(несмотря на то, если вы звоните ему new, он будет возвращать объект).

Для того, чтобы создать что-то, что вынашивал соответствующий интерфейс без жалуясь компилятора, вы должны сделать что-то вроде этого:

var MyType = (() : MyInterface => {
  return function() { 
    return "Hello"; 
  }
})();
alert(MyType());
Ответил 07/10/2012 в 16:32
источник пользователем

голоса
4

Примеры кода в этом ответе предполагают следующее заявление:

var implementation: MyInterface;

Обеспечение реализации отзывной интерфейса

В качестве последующей деятельности в связи с принятым ответом , как это было предложено некоторыми из его commentors, функция , которая соответствует вызову подпись интерфейса неявно реализует интерфейс. Таким образом , вы можете использовать любую функцию соответствия в качестве реализации.

Например:

implementation = () => "Hello";

Вам не нужно явно указать, что функция реализует интерфейс. Тем не менее, если вы хотите быть явным, вы можете использовать бросок:

implementation = <MyInterface>() => "Hello";

Обеспечение многоразовых реализаций

Если вы хотите произвести многоразовую реализацию интерфейса, как вы обычно бы с # интерфейсом Java или C, просто хранить функцию где-то доступным для потребителей.

Например:

function Greet() {
    return "Hello";
}

implementation = Greet;

Обеспечение реализации параметризованный

Вы можете быть в состоянии параметризации осуществления таким же образом, что вы могли бы параметризацию класса. Вот один из способов сделать это:

function MakeGreeter(greeting: string) {
    return () => greeting;
}

implementation = MakeGreeter("Hello");

Если вы хотите, чтобы результат быть набраны как интерфейс, так же явно задать тип возвращаемого значения или отливать значение возвращается.

Ответил 23/12/2013 в 02:45
источник пользователем

голоса
1

В случае, если вызываемая интерфейс должен иметь другие методы, которые вы можете сделать это следующим образом:

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.setName('Dolly');
greeter(); // prints 'Hello Dolly!'

Даунсайд: greeter instanceof ConsoleGreeterестьfalse

Ответил 25/01/2018 в 08:08
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more