Преобразование javascript цепного сеттера в машинописный текст - PullRequest
0 голосов
/ 03 апреля 2020

Я использую эту идиому в javascript для создания цепочек сеттеров.

function bar() {

    let p = 0;

    function f() {
    }

    f.prop = function(d) {
        return !arguments.length ? p : (p = d, f);
    }

    return f;

}

Это позволяет мне легко создавать и настраивать как const b = bar().prop(2), имея b в качестве функции и добавление более цепочек утверждений. И это работает для получения свойства с помощью b.prop(), который, конечно, не может быть далее соединен.

Я пытаюсь преобразовать это в TypeScript и нашел это решение, которое хотя и позволяет правильно печатать , это кажется неясным.

p.prop = (...args: [number?]) => !args.length ? p : (p = args[0]!, f);

Это становится еще более неясным, когда для аргумента есть несколько типов.

p.prop = (...args: [(number | boolean)?]) => !args.length ? p : (p = args[0]!, f);

Есть ли какой-либо идиоматический c машинописный способ сделать эту настройку и получать?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Поскольку функция prop принимает только один возможный аргумент, вы можете сделать версию Typescript более похожей на Javascript (и более простую), просто объявив d как необязательный, а затем проверив, существует ли он. Нет необходимости в синтаксисе отдыха или массиве:

f.prop = function(d?: number) {
    return d === undefined ? p : (p = d, f);
}

Для дополнительных типов просто добавьте тип к параметру d, и так как он будет присвоен p, также объявите тип из p:

function bar() {
    let p: number | boolean = 0;
    function f() {
    }
    f.prop = function (d?: number | boolean) {
        return d === undefined ? p : (p = d, f);
    }
    return f;
}
const b = bar().prop(2)
0 голосов
/ 03 апреля 2020

Вы можете объявить интерфейс функции как:

interface Chainable {
    (): void;
    prop: (d: any) => Chainable
};

function bar(): Chainable {
   ... 
   const fChainable = f;
   return fChainable;

}

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