Как я могу комментировать рекурсивные типы в машинописном?

голоса
10

Если у меня есть функция, как это:

function say(message: string) {
    alert(message);
    return say;
}

он имеет интересное свойство, что я могу цепочка вызовов к нему:

say(Hello,)(how)(are)(you?);

Компилятор выдаст предупреждение, если я прохожу номер в первый звонок, но это позволит мне поставить цифры в последующие вызовы.

say(Hello)(1)(2)(3)(4)

Что аннотация типа мне нужно сделать , чтобы добавить к sayфункции , чтобы компилятор генерировать предупреждения , когда я прохожу в недопустимых типах к прикованным вызовам?

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


2 ответов

голоса
18

Тип, который ссылается сам должен иметь имя. Например,

interface OmegaString {
    (message: string): OmegaString;
}

то вы можете аннотировать sayкак OmegaString,

function say(message: string): OmegaString {
    alert(message);
    return say;
}

то следующий код будет проверять тип.

say("Hello,")("how")("are")("you?");

но следующий не будет,

say("Hello")(1)(2)(3)(4)
Ответил 12/10/2012 в 01:40
источник пользователем

голоса
0

метод змеевидных

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

Без this:

class StatusLogger {
    log(message: string): StatusLogger { ... }
}
// this works
new ErrorLogger().log('oh no!').log('something broke!').log(':-(');

class PrettyLogger extends StatusLogger {
    color(color: string): PrettyLogger { ... }
}
// this works
new PrettyLogger().color('green').log('status: ').log('ok');
// this does not!
new PrettyLogger().log('status: ').color('red').log('failed');

С this:

class StatusLogger {
    log(message: string): this { ... }
}
class PrettyLogger extends StatusLogger {
    color(color: string): this { ... }
}
// this works now!
new PrettyLogger().log('status:').color('green').log('works').log('yay');

функция змеевидных

Когда функция цепная вы можете ввести его с интерфейсом:

function say(text: string): ChainableType { ... }
interface ChainableType {
    (text: string): ChainableType;
}
say('Hello')('World');

Функция змеевидных со свойствами / методов

Если функция имеет другие свойства и методы (например , jQuery(str)против jQuery.data(el)), вы можете ввести саму функцию в качестве интерфейса:

interface SayWithVolume {
    (message: string): this;
    loud(): this;
    quiet(): this;
}

const say: SayWithVolume = ((message: string) => { ... }) as SayWithVolume;
say.loud = () => { ... };
say.quiet = () => { ... };

say('hello').quiet()('can you hear me?').loud()('hello from the other side');
Ответил 01/05/2017 в 06:44
источник пользователем

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