Можно ли в машинописном тексте сделать так, чтобы модуль работал? - PullRequest
0 голосов
/ 06 мая 2020

Я хотел бы создать функцию / модуль / класс, который я мог бы вызвать следующим образом:

const myvar = MyModule('a parameter').methodA().methodB().methodC();

//but also this should work

const myvar = MyModule('a parameter').methodC().methodA();

Другими словами, чтобы создать модуль c stati, который может принимать другое количество "Перезвони?" в любом возможном порядке.

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

Возможно ли это вообще?

РЕДАКТИРОВАТЬ

Чтобы было понятнее. Мне нужен способ обработки строки как ввода с помощью разных методов. Каждый метод обрабатывает строку и возвращает результат следующему методу. Если метод не прикреплен, он вернет строку.

Возможно, я прошу что-то невозможное. Но, возможно, существует что-то, что имеет аналогичную структуру и тот же результат.

Ответы [ 3 ]

0 голосов
/ 07 мая 2020

Вот еще одно решение, наиболее близкое к ожидаемому результату

function MyModule(str: string) {
  return {
    str,
    methodA() {
      this.str = this.str.toUpperCase() + '1';
      return this;
    },
    methodB() {
      this.str = this.str.toLowerCase() + '2';
      return this;
    },
    methodC() {
      this.str = str.substr(0, 4);
      return this;
    },
    toString() {
      return this.str;
    },
    valueOf() {
      return this.str;
    }
  }
}

const myvar = MyModule('a parameter').methodA().methodB().methodC();
const myvar2 = MyModule('a parameter2').methodB().methodA();
console.log(`myvar: ${myvar}`);
console.log(`myvar2: ${myvar2}`);

вывод:

myvar: a pa
myvar2: A PARAMETER221

Но есть одна проблема, если вы console.log(myvar) то вы увидит не строку, а объект. Чтобы достичь своей цели, вам нужно объединить эту переменную со строкой или просто вызвать метод .toString();

> console.log(myvar);
{
  str: 'a pa',
  methodA: [Function: methodA],
  methodB: [Function: methodB],
  methodC: [Function: methodC],
  toString: [Function: toString],
  valueOf: [Function: valueOf]
}

> console.log(myvar + myvar2);
a paA PARAMETER221

> console.log(myvar.toString());
a pa

> console.log('' + myvar);
a pa

> console.log(`${myvar}`);
a pa
0 голосов
/ 07 мая 2020

Это мое решение на данный момент:

export default class sanitize {

    private _var:any = '';

    private static _instance:sanitize;

    private constructor(){}

    private static _g(){
        return this._instance || (this._instance = new this());
    }
    public static return(){
        const ret = this._g()._var;
        this._g()._var = '';
        return ret;
    }
    private static return_class(){
        return this;
    }
    private static check_string(){
        if(typeof this._g()._var != 'string')
            this.string(this._g()._var);
    }
    public static string(variable:any){
        if(typeof variable.toString != undefined)
            this._g()._var = variable.toString();
        else
            this._g()._var = '';
        return this.return_class();
    }
    public static alphanum(){
        this.check_string();
        this._g()._var = this._g()._var.replace(/[^\w\s]/gi, '');
        return this.return_class();
    }
    public static tolow(){
        this.check_string();
        this._g()._var = this._g()._var.toLowerCase();
        return this.return_class();
    }
    public static toup(){
        this.check_string();
        this._g()._var = this._g()._var.toUpperCase();
        return this.return_class();
    }
    public static subs(start:number, end:number){
        this.check_string();
        this._g()._var = this._g()._var.substring(start, end);
        return this.return_class();
    }
}
// And then I call

const san_str = sanitize.string('could be a number').alphanum().tolow().return();
0 голосов
/ 06 мая 2020

Да, это возможно, но без stati c класс с именем MyModule, вам нужно добавить в String прототип новые методы

declare interface String {
  methodA(): string;
  methodB(): string;
}

String.prototype.methodA = function(this: string) {
  return this.toLowerCase() + 'Lower';
}

String.prototype.methodB = function(this: string) {
  return this.toUpperCase() + 'Upper';
}

console.log('hello'.methodA().methodB(), 'hello2'.methodB().methodA().methodB());

Вывод:

HELLOLOWERUpper HELLO2UPPERLOWERUpper

Но я не уверен, что вы этого ожидаете

...